home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / rbbsbas.zip / CNFG-SUB.BAS < prev    next >
BASIC Source File  |  1988-10-02  |  93KB  |  2,121 lines

  1. ' $linesize:132
  2. ' $title: 'CNFG-SUB.BAS CPC17-1A, Copyright 1987-88 by D. Thomas Mack'
  3. '  Copyright 1987 and 1988 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: CNFG-SUB.BAS
  5. '  Written by .........: D. Thomas Mack
  6. '  First Released .....: March 15, 1987
  7. '  Subsequent Releases.: November 15, 1987, March 27, 1988, October 2, 1988
  8. '  Copyright ..........: 1987-88
  9. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  10. '                        RBBS-PC, configuration program -- CONFIG.BAS
  11. '                        utilizes a lot of menus and string space.
  12. '                        These are incorporated within CNFG-SUB.BAS as a
  13. '                        seperately callable subroutines in order to free
  14. '                        up as much code as possible within the 64K code
  15. '                        segment used by CONFIG.BAS.
  16. '  Parameters..........: Most parameters are passed via a COMMON statement.
  17. '
  18. ' Subroutine  Line      Function of Subroutine
  19. '    Name    Number
  20. ' ALLCAPS    61212+     Captialize a string
  21. ' ANSIDECODE 62040+     Convert ANSI strings into english text expressions
  22. ' ANYINTEGER 61450      Prompt for any integer
  23. ' ANYNUMBER  61400      Prompt for any number
  24. ' ASKRO      61100      Ask a question on a specific row
  25. ' ASKUPOS    61300      Ask for identifying field in USERS record
  26. ' BRKFNAME   61830      Break file name in drive/path, prefix, extension
  27. ' CHKFMSDIR  61700      Check FMS directory for valid structure
  28. ' CHKPERSDIR 61755      Check Personal directory format
  29. ' CNFGINIT   60385      Initialize CONFIG's constants
  30. ' COLORCODE  62040+     Convert response into ANSI-meaningful strings
  31. ' DISPLAY    12190      Display the CONFIG menu pages
  32. ' FINDFILE   61600      Determine whether a file exists
  33. ' FINDLAST   61850      Find last occurence of a character in a string
  34. ' GETANSI    62000      Prompt for ANSI colors to be used
  35. ' GETASCII   61810      Get any character by character or ascii value
  36. ' GETCOLOR   61950      Process request for setting color
  37. ' GETINIT    61110      Get answers that are integers
  38. ' GETNUMYN   61150      Get TRUE/FALSE answer to a YES/NO question
  39. ' GETYESNO   61200      Ask a question with a "yes" or "no" response
  40. ' HANDERR    61775+     Handle error checking for FMS directories
  41. ' MMINTEGER  61500      Prompt for integer with min and a max
  42. ' NETTYPE    60382      Prompt for supported network types
  43. ' REMOVE     61800      Remove characters from a string
  44. ' SECURE     61860      Allow commands and their security level to be changed
  45. ' TRIMTRAIL  61840      Remove trailing characters from a string
  46. '
  47. '  $INCLUDE: 'CNFG-VAR.BAS'
  48. '
  49. '  $SUBTITLE: 'DISPLAY - subroutine to display CONFIG's menus'
  50. '  $PAGE
  51. '
  52. '  SUBROUTINE NAME    --  DISPLAY
  53. '
  54. '  INPUT PARAMETERS   --  PARAMETER        DESCRIPTION
  55. '                         IX = 0           DISPLAY THE CHOICE OF MENUS
  56. '                         IX = -1          RE-READ THE INPUT (INVALID REQUEST)
  57. '                         IX > 0           DISPLAY THE APPROPRIATE PAGE
  58. '
  59. '  OUTPUT PARAMETERS  --  HJ$              OPTION SELECTED
  60. '                         IPAGE            MENU PAGE CONTAINING OPTION
  61. '                         ILOOKUP          INDEX (1 TO 20) OF OPTION SELECTED
  62. '
  63. '  SUBROUTINE PURPOSE --  TO DISPLAY CONFIG'S MENUS AND REQUEST OPTION
  64. '
  65.       SUB DISPLAY STATIC
  66. '
  67. ' *  DISPLAY CONFIG'S MAIN FUNCTION KEY MENU
  68. '
  69.       IF IX > 0 THEN _
  70.          GOTO 12320
  71.       IF IX = -1 THEN _
  72.          GOTO 12590
  73. 12190 COLOR FG,BG,BORDER
  74.       CLS
  75.       DISPLAYED.PAGE.NUMBER = 0
  76.       I! = FRE(C$)
  77.       COLOR 0,7,0
  78.       LOCATE 4,10
  79.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " CONFIGURATION PROGRAM "
  80.       COLOR FG,BG,BORDER
  81.       LOCATE 1,1,0
  82.       PRINT "Copyright (c) 1983-1988 Tom Mack"
  83.       LOCATE 2,1,0
  84.       PRINT "39 Cranbury Dr, Trumbull, CT. 06611";
  85.       IF CONFERENCE.MODE THEN _
  86.          GOSUB 24970
  87.       LOCATE  5,1
  88.       PRINT "   F1            Global RBBS-PC Parameters (part 1)
  89.       PRINT "   F2            Global RBBS-PC Parameters (part 2)
  90.       PRINT "   F3            Global RBBS-PC Parameters (part 3)
  91.       PRINT "   F4            RBBS-PC System Files (part 1)
  92.       PRINT "   F5            RBBS-PC System Files (part 2)
  93.       PRINT "   F6            Parameters for RBBS-PC's 'Doors'
  94.       PRINT "   F7            Parameters for RBBS-PC's Security (part 1)
  95.       PRINT "   F8            Parameters for RBBS-PC's Security (part 2)
  96.       PRINT "   F9            Parameters for multiple RBBS-PC's
  97.       PRINT "  F10            RBBS-PC utilities
  98.       PRINT "  Shift-F1       RBBS-PC File Management Faciliites"
  99.       PRINT "  Shift-F2       RBBS-PC Communications Parameters (part 1)
  100.       PRINT "  Shift-F3       RBBS-PC Communications Parameters (part 2)
  101.       PRINT "  Shift-F4       Parameters for RBBS-PC NET-MAIL
  102.       PRINT "  Shift-F5       New users parameters"
  103.       PRINT "  Shift-F6       Library Sub-System"
  104.       PRINT "  Shift-F7       RBBS-PC Color parameters"
  105.       PRINT "  Shift-F8       Reserved for future use"
  106.       XX$ = "Press END to terminate or Function Key to select page for parameters shown "
  107.       GOSUB 50345
  108.       LOCATE ,,1
  109. 12310 GOSUB 22160
  110. 12320 IF IX THEN _            'IX    Key    Where to branch to
  111.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  112.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  113.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  114.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  115.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  116.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  117.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  118.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  119.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  120.                     12480, _  '10      F10 - RBBS-PC's utilities
  121.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  122.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  123.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  124.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  125.                     12520, _  '15 Shift-F5 - New user parameters
  126.                     12530, _  '16 Shift-F6 - Library parameters
  127.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  128.                     12310, _  '18 Shift-F8 - Reserved for future use
  129.                     12340, _  '19     PgUp - Go to previous page
  130.                     12330, _  '20     PgDn - Go to next page
  131.                     12630, _  '21      End - Terminate CONFIG
  132.                     12350     '22    Enter - Re-display current page
  133.       GOTO 12310
  134. '
  135. ' *  COMMON ROUTINE TO HANDLE UNDEFINED OPTIONS
  136. '
  137. 12325 IX = IPAGE
  138.       GOTO 12320
  139. '
  140. ' *  COMMON ROUTINE TO HANDLE PAGE UP OF DISPLAYS
  141. '
  142. 12330 IF (DISPLAYED.PAGE.NUMBER + 1 ) > 17 THEN _
  143.          GOTO 12190
  144.       IX = DISPLAYED.PAGE.NUMBER + 1
  145.       GOTO 12320
  146. '
  147. ' *  COMMON ROUTINE TO HANDLE PAGE DOWN OF DISPLAYS
  148. '
  149. 12340 IF (DISPLAYED.PAGE.NUMBER - 1) < 1 THEN _
  150.          GOTO 12190
  151.       IX = DISPLAYED.PAGE.NUMBER - 1
  152.       GOTO 12320
  153. '
  154. ' *  RETURN TO PRIMARY MENU SELECTION DISPLAY
  155. '
  156. 12350 GOSUB 60380
  157.       GOTO 12310
  158. '
  159. ' *  COMMON CONFIGURATION PROGRAM MENU AND PAGE DISPLAY
  160. '
  161. 12360 DISPLAYED.PAGE.NUMBER = 1
  162.       GOSUB 24800
  163.       LOCATE  3,1
  164.       PRINT " 1. SYSOP's Public First Name -------------------- " + SYSOP.FIRST.NAME$
  165.       PRINT " 2. SYSOP's Public Last Name --------------------- " + SYSOP.LAST.NAME$
  166.       PRINT " 3. SYSOP's default expert mode at signon -------- " + EXPERT.USER$
  167.       PRINT " 4. SYSOP's office hours -------------------------"STR$(START.OFFICE.HOURS);" to"STR$(END.OFFICE.HOURS)
  168.       PRINT " 5. Page SYSOP using printer's bell -------------- " + M11$
  169.       PRINT " 6. Go off-line whenever a DISK FULL occurs ------ " + MID$("NO YES",(DISKFULL.GO.OFFLINE*-3)+1,3)
  170.       PRINT " 7. Prompt bell default is ----------------------- " + PROMPT.BELL$
  171.       PRINT " 8. Maximum time per session (in minutes) --------"STR$(MINUTES.PER.SESSION!)
  172.       PRINT " 9. Maximum minutes per day ----------------------";STR$(MAX.PER.DAY)
  173.       PRINT "10. Factor to extend session time for uploads ----" + STR$(UPLOAD.TIME.FACTOR!)
  174.       PRINT "11. # Months of inactivity before user deleted ---"STR$(ACT.MNTHS.B4.DELETING)
  175.       PRINT "12. Name of RBBS-PC shown initially is ----------- " + RBBS.NAME$
  176.       PRINT "13. Foreground color (for color monitors) is -----"STR$(FG)
  177.       PRINT "14. Background color (for color monitors) is -----"STR$(BG)
  178.       PRINT "15. The border color (for color monitors) is -----"STR$(BORDER)
  179.       PRINT "16. Your CONFIG.SYS contains 'DEVICE=ANSI.SYS'---- " + FNYESNO$(DOSANSI)
  180.       IF SMART.TEXT THEN _
  181.          SMART.TEXT$ = STR$(SMART.TEXT) _
  182.       ELSE SMART.TEXT$ = "<none>"
  183.       PRINT "17. Control character for SMART TEXT -------------" + SMART.TEXT$
  184.       PRINT "18. File with automatic operator page parameters - " ; AUTOPAGE.DEF$
  185.       X = INSTR("ANS",LOGON.MAIL.LEVEL$)
  186.       IF X < 1 THEN _
  187.          X = 1
  188.       X$ = MID$("OLD & NEWNEW ONLY NONE",9*X-8,9)
  189.       IF X$ = "NONE" THEN _
  190.          X$ = "<none>"
  191.       PRINT "19. Personal mail notification level at logon is - " + X$
  192.       GOTO 12580
  193. 12370 DISPLAYED.PAGE.NUMBER = 2
  194.       GOSUB 24800
  195.       LOCATE  3,1
  196.       PRINT "21. Remind users of messages that they left ------ " + FNYESNO$(MESSAGE.REMINDER)
  197.       PRINT "22. Remind users of # uploads and downloads? ----- " + FNYESNO$(REMIND.FILE.TRANSFERS)
  198.       PRINT "23. Remind users of their terminal profile? ------ " + FNYESNO$(REMIND.PROFILE)
  199.       PRINT "24. Enable download of new files at logon -------- " + FNYESNO$(NEW.FILES.CHECK)
  200.       PRINT "25. Default user page length is ------------------" + STR$(PAGE.LENGTH)
  201.       PRINT "26. Maximum number of lines allowed per message --" + STR$(MAX.MESSAGE.LINES)
  202.       PRINT "27. Is system 'welcome' interruptable? ----------- " + FNYESNO$(WELCOME.INTERRUPTABLE)
  203.       PRINT "28. Are system bulletins to be 'optional'? ------- " + FNYESNO$(BULLETINS.OPTIONAL)
  204.       PRINT "29. Type of PC RBBS-PC will be running on? ------- " + COMPUTER.TYPE$
  205.       PRINT "30. Symbols to use for SYSOP commands ------------ " + SYSOP.COMMANDS$
  206.       PRINT "31. Symbols to use for MAIN menu commands -------- " + MAIN.COMMANDS$
  207.       PRINT "32. Symbols to use for FILE menu commands -------- " + FILE.COMMANDS$
  208.       PRINT "33. Symbols to use for UTILITIES menu commands --- " + UTIL.COMMANDS$
  209.       PRINT "34. Symbols to use for global commands ----------- " + GLOBAL.COMMANDS$
  210.       PRINT "35. Show section in command prompt --------------- " + FNYESNO$(SHOW.SECTION)
  211.       PRINT "36. Show commands in command prompt -------------- " + FNYESNO$(COMMANDS.IN.PROMPT)
  212.       PRINT "37. Restrict valid commands to current section --- " + FNYESNO$(RESTRICT.VALID.CMDS)
  213.       PRINT "38. Use machine language routines for speed ------ " + FNYESNO$(TURBO.RBBS)
  214.       PRINT "39. Use BASIC PRINT for screen writes ------------ " + FNYESNO$(USE.BASIC.WRITES)
  215.       PRINT "40. # of lines for extended file descriptions ----" + STR$(MAX.EXTENDED.LINES)
  216.       GOTO 12580
  217. 12380 DISPLAYED.PAGE.NUMBER = 3
  218.       GOSUB 24800
  219.       LOCATE  3,1
  220.       PRINT "41. Field used to identify users ----------------- " + HASH.ID$
  221.       PRINT "42. Field used to distinguish users with same ID-- " + INDIV.ID$
  222.       PRINT "43. Start position identifying personal downloads-"  + STR$(PERSONAL.BEGIN)
  223.       PRINT "44. Field length to identify personal downloads --"  + STR$(PERSONAL.LEN)
  224.       PRINT "45. Prompt for first part of personal identifier - " + FIRST.NAME.PROMPT$
  225.       PRINT "46. Prompt for last part of personal identifier -- " + LAST.NAME.PROMPT$
  226.       PRINT "47. Enforce upload/download ratios --------------- " + FNYESNO$(ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
  227.       PRINT "48. RESTRICT users by SUBSCRIPTION date ---------- " + FNYESNO$(RESTRICT.BY.DATE)
  228.       PRINT "49. Security level when SUBSCRIPTION expires -----"  + STR$(EXPIRED.SECURITY)
  229.       PRINT "50. Days before expiration to warn callers -------"  + STR$(DAYS.TO.WARN)
  230.       PRINT "51. Default # days in SUBSCRIPTION PERIOD --------"  + STR$(DAYS.IN.SUBSCRIPTION.PERIOD)
  231.       PRINT "52. Turn printer off after each recycle ---------- " + FNYESNO$(TURN.PRINTER.OFF)
  232.       PRINT "53. Play musical themes for RBBS-PC functions----- " + FNYESNO$(MUSIC)
  233.       PRINT "54. BUFFER SIZE used when displaying text files --" + STR$(BUFFER.SIZE)
  234.       PRINT "55. Stack space to be made available -------------" + STR$(SIZE.OF.STACK)
  235.       PRINT "56. File shown users when SYSOP wants system next  " + NOT.YET.IN$ ' F7.MESSAGE$
  236.       PRINT "57. Ask users their (What is your ...) ----------- " + USER.LOCATION$
  237.       PRINT "58. Show ALL DIRECTORIES in order in dir of dir -- " + FNYESNO$(USE.DIR.ORDER)
  238.       PRINT "59. BUFFER SIZE for writes on internal protocols -" + STR$(WRITE.BUF.DEF)
  239.       GOTO 12580
  240. 12390 DISPLAYED.PAGE.NUMBER = 4
  241.       GOSUB 24800
  242.       IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
  243.          DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + ":"
  244.       LOCATE  3,1
  245.       PRINT "61. Drive and file describing 'bulletins' is ----- " + DRIVE.FOR.BULLETINS$ + BULLETIN.MENU$
  246.       PRINT "62. Number of active 'bulletins' -----------------" + STR$(ACTIVE.BULLETINS)
  247.       PRINT "63. Prefix used to name bulletin files is -------- " + BULLETIN.PREFIX$
  248.       PRINT "64. Drive and path (optional) for 'help' files --- " + HELP.PATH$
  249.       PRINT "65. Prefix used to name three major 'help' files - " + HELP.FILE.PREFIX$
  250.       PRINT "66. Extension for help files of individual cmds -- " + HELP.EXTENSION$
  251.       PRINT "67. HELP file when callers CATEGORIZE uploads ---- " + UPCAT.HELP$
  252.       PRINT "68. Name of 'newuser' file shown to new users ---- " + NEWUSER.FILE$
  253.       PRINT "69. Name of 'welcome' file shown at logon -------- " + WELCOME.FILE$
  254.       PRINT "70. The SYSOP's command menu is named ------------ " + MENU$(1)
  255.       PRINT "71. The MAIN system menu is named ---------------- " + MENU$(2)
  256.       PRINT "72. The file subsystem menu is named ------------- " + MENU$(3)
  257.       PRINT "73. The utilities subsystem menu is named -------- " + MENU$(4)
  258.       PRINT "74. Menu that lists available conferences is ----- " + CONFERENCE.MENU$
  259.       PRINT "75. Menu that lists questionnaires available is -- " + ANS.MENU$
  260.       PRINT "76. Drive/path for optional questionnaires ------- " + QUES.PATH$
  261.       PRINT "77. File with main SYSOP-supplied user interface - " + MAIN.PUI$
  262.       PRINT "78. Allow menus to pause in the middle ----------- " + FNYESNO$(MENUS.CAN.PAUSE)
  263.       PRINT "79. Drive/path where macro files are stored ------ " + MACRO.DRVPATH$
  264.       PRINT "80. Extension of macro files --------------------- " + MACRO.EXTENSION$
  265.       GOTO 12580
  266. 12400 DISPLAYED.PAGE.NUMBER = 5
  267.       GOSUB 24800
  268.       LOCATE  3,1
  269.       PRINT " 81. File containing invalid user names ----------- " + TRASHCAN.FILE$
  270.       PRINT " 82. Name questionnaire required of ALL callers --- " + REQUIRED.QUESTIONNAIRE$
  271.       PRINT " 83. Name of 'pre-log' file ----------------------- " + PRELOG$
  272.       PRINT " 84. Name of questionnaire required of new users -- " + NEW.USER.QUESTIONNAIRE$
  273.       PRINT " 85. Name of 'epi-log' questionnaire -------------- " + EPILOG$
  274.       PRINT " 86. System file containing messages is named ----- " + MAIN.MESSAGE.FILE$
  275.       PRINT " 87. System file for recording users is named ----- " + MAIN.USER.FILE$
  276.       PRINT " 88. System file for comments to SYSOP is named --- " + COMMENTS.FILE$
  277.       PRINT " 89. Record comments as private messages ---------- " + MID$("NO YES",(COMMENTS.AS.MESSAGES*-3)+1,3)
  278.       PRINT " 90. System file for 'callers' is named ----------- " + CALLERS.FILE$
  279.       PRINT " 91. Extended logging to 'callers' file ----------- " + MID$("NO YES",(EXTENDED.LOGGING*-3)+1,3)
  280.       PRINT " 92. Wrap-around the 'callers' file --------------- " + NOT.YET.IN$ ' WRAP.CALLERS.FILE$
  281.       PRINT " 93. File controlling scan for mail waiting ------- " + CONFMAIL.LIST$
  282.       GOTO 12580
  283. 12410 DISPLAYED.PAGE.NUMBER = 6
  284.       GOSUB 24800
  285.       LOCATE  3,1
  286.       PRINT "101. Is the 'door' subystem available? ------------ " + MID$("NO YES",(DOORS.AVAILABLE*-3)+1,3)
  287.       PRINT "102. The 'door' subsystem menu is named ----------- " + MENU$(5)
  288.       PRINT "103. File built dynamically to open a 'door' ------ " + RCTTY.BAT$
  289.       PRINT "104. When a 'door' closes, re-invoke RBBS-PC via -- " + RBBS.BAT$
  290.       PRINT "105. Drive/path to look for COMMAND.COM on -------- " + DISK.FOR.DOS$
  291.       PRINT "106. Use the Dos 'CTTY' command to redirect I/O --- " + MID$("NO YES",(REDIRECT.IO.METHOD*-3)+1,3)
  292.       PRINT "107. Invoke RBBS 'drivers' via ... ---------------- " + GO.TO.SHELL$
  293.       PRINT "108. Program to check users at logon -------------- " + REGISTRATION.PROGRAM$
  294.       GOTO 12580
  295. 12420 DISPLAYED.PAGE.NUMBER = 7
  296.       GOSUB 24800
  297.       LOCATE  3,1
  298.       PRINT "121. Pseudonym to sign on remotely as the SYSOP ---- " + MN1$+ " " +MN2$
  299.       PRINT "122. ESC key logs SYSOP on locally without password- " + FNYESNO$(ESCAPE.INSECURE)
  300.       PRINT "123. Minimum security level to log on RBBS-PC ------" + STR$(MINIMUM.LOGON.SECURITY)
  301.       PRINT "124. Default security level for new callers --------" + STR$(DEFAULT.SECURITY.LEVEL)
  302.       PRINT "125. Security level for SYSOP ----------------------" + STR$(SYSOP.SECURITY.LEVEL)
  303.       PRINT "126. Minimum security level to see SYSOP's menu ----" + STR$(SYSOP.MENU.SECURITY.LEVEL)
  304.       PRINT "127. Minimum security to leave extended description-" + STR$(ASK.EXTENDED.DESC)
  305.       PRINT "128. Max # security violations before disconnect ---" + STR$(MAXIMUM.VIOLATIONS)
  306.       M22$ = STR$(SYSOP.FUNCTION(1))
  307.       IX = SYSOP.FUNCTION(1)
  308.       FOR I = 2 TO NUM.SYSOP
  309.         IF IX <> SYSOP.FUNCTION(I) THEN _
  310.            M22$ = "(Variable)" : _
  311.            GOTO 12430
  312.       NEXT
  313. 12430 PRINT "129. Security level for SYSOP functions ------------" + M22$
  314.       M23$ = STR$(MAIN.FUNCTION(1))
  315.       IX = MAIN.FUNCTION(1)
  316.       FOR I = 2 TO NUM.MAIN
  317.         IF IX<>MAIN.FUNCTION(I) THEN _
  318.            M23$ = "(Variable)" : _
  319.            GOTO 12440
  320.       NEXT
  321. 12440 PRINT "130. Security level for main menu functions --------" + M23$
  322.       M24$ = STR$(FILES.FUNCTION(1))
  323.       IX = FILES.FUNCTION(1)
  324.       FOR I = 2 TO NUM.FILES
  325.         IF IX<>FILES.FUNCTION(I) THEN _
  326.            M24$ = "(Variable)" : _
  327.            GOTO 12450
  328.       NEXT
  329. 12450 PRINT "131. Security level for file menu functions --------" + M24$
  330.       M25$ = STR$(UTILITY.FUNCTION(1))
  331.       IX = UTILITY.FUNCTION(1)
  332.       FOR I = 2 TO NUM.UTILITY
  333.         IF IX<>UTILITY.FUNCTION(I) THEN _
  334.            M25$ = "(Variable)" : _
  335.            GOTO 12460
  336.       NEXT
  337. 12460 PRINT "132. Security level for utilities menu functions ---" + M25$
  338.       M26$ = STR$(GLOBAL.FUNCTION(1))
  339.       IX = GLOBAL.FUNCTION(1)
  340.       FOR I = 1 TO NUM.GLOBAL
  341.         IF IX<>GLOBAL.FUNCTION(I) THEN _
  342.            M26$ = "(Variable)" : _
  343.            GOTO 12465
  344.       NEXT
  345. 12465 PRINT "133. Security level for GLOBAL commands ------------" + M26$
  346.       PRINT "134. Max # of password changes in a session --------" + STR$(MAXIMUM.PASSWORD.CHANGES)
  347.       PRINT "135. Minimun security for temp. password changes ---" + STR$(MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
  348.       PRINT "136. Minimum security to overwrite on uploads ------" + STR$(OVERWRITE.SECURITY.LEVEL)
  349.       PRINT "137. User's security exempted from 'packing' -------" + STR$(SEC.LVL.EXEMPT.FRM.PURGING)
  350.       PRINT "138. Default security to read new PRIVATE messages -"  + STR$(PRIVATE.READ.SEC)
  351.       PRINT "139. Default security to read new PUBLIC messages --"  + STR$(PUBLIC.READ.SEC)
  352.       PRINT "140. Minimum security to change msg.'s security ----"  + STR$(SEC.CHANGE.MSG)
  353.       GOTO 12580
  354. 12466 DISPLAYED.PAGE.NUMBER = 8
  355.       GOSUB 24800
  356.       LOCATE  3,1
  357.       PRINT "141. Call-back verification ----------------------- " + NOT.YET.IN$ ' CALLBACK.VERIFICATION$
  358.       PRINT "142. Drive/path where personal files & dir stored - " + PERSONAL.DRVPATH$
  359.       PRINT "143. Name of Personal Directory ------------------- " + PERSONAL.DIR$
  360.       PRINT "144. Protocol required for personal downloads ----- " + MID$("<none>  Ascii  XMODEM Xm/CRC Kermit Ymodem Imodem YmodemGWxmodem", 7 * INSTR("NAXCKYIGW",PERSONAL.PROTOCOL$) - 6,7)
  361.       PRINT "145. Files with download security are listed in --- " + FILESEC.FILE$
  362.       PRINT "146. File name with privileged group passwords is - " + PASSWORD.FILE$
  363.       PRINT "147. Concatenate multi-file ASCII downloads ------- " + FNYESNO$(PERSONAL.CONCAT)
  364.       PRINT "148. Min SECURITY to CATEGORIZE uploads -----------" + STR$(SL.CATEGORIZE.UPLOADS)
  365.       PRINT "149. Min security level to view new uploads -------" + STR$(MIN.SEC.TO.VIEW)
  366.       PRINT "150. Security level exempt from 'epi-log' file ----" + STR$(SECURITY.EXEMPT.FROM.EPILOG)
  367.       PRINT "151. Min. security to 'AUTO ADD' conference user --" + AUTO.ADD.SECURITY$
  368.       PRINT "152. Min. security for old caller to turbo logon --" + STR$(ALLOW.CALLER.TURBO)
  369.       PRINT "153. Min. security to describe an existing file ---" + STR$(ADD.DIR.SECURITY)
  370.       PRINT "154. Help file to display for a security violation- " + SECVIO.HLP$
  371.       TIME.LOCK$ = MID$("<none> DOORS  DOWNLDSBOTH   ",TIME.LOCK*7+1,7)
  372.       PRINT "155. Time lock on DOORS and DOWNLOADS ------------- "; TIME.LOCK$
  373.       GOTO 12580
  374. 12470 DISPLAYED.PAGE.NUMBER = 9
  375.       GOSUB 30040
  376.       ' MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
  377.       MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
  378.       MAX.ALLOWED.MSGS.FRM.DEF  = MAXIMUM.NUMBER.OF.MSGS
  379.       GOSUB 24800
  380.       LOCATE  3,1
  381.       PRINT "161. Maximum number of concurrent RBBS-PC's  -------" + STR$(MAXIMUM.NUMBER.OF.NODES)
  382.       MT$ = "single RBBS-PC copy "
  383.       IF MAXIMUM.NUMBER.OF.NODES <> 1 THEN _
  384.          MT$ = "concurrent RBBS-PC's" : _
  385.          SUBROUTINE.PARAMETER = 2 : _
  386.          IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  387.             SUBROUTINE.PARAMETER = 1 : _
  388.             CALL NETTYPE : _
  389.          ELSE CALL NETTYPE
  390.       IF NETWORK.TYPE = 6 THEN _
  391.          MT$ = "NETBIOS             "
  392.       IF NETWORK.TYPE = 7 THEN _
  393.          MT$ = "DoubleDOS           "
  394.       PRINT "162. Environment running " + MT$ + " ------ " + NETWORK.TYPE$
  395.       PRINT "163. RBBS-PC 'recycle' method when users log off --- " + RECYCLE.TO.DOS$
  396.       FILE$ = MAIN.MESSAGE.FILE$
  397.       GOSUB 30180
  398.       MAX.MSG.FILE.SIZE.FRM.DEF! = UG
  399.       PRINT "164. Number of records in the " + MAIN.USER.FILE$ + " file " + STRING$(16-LEN(MAIN.USER.FILE$),"-");STR$(MAX.USR.FILE.SIZE.FRM.DEF)
  400.       PRINT "165. Number of records in " + MAIN.MESSAGE.FILE$ + " file " + STRING$(20-LEN(MAIN.MESSAGE.FILE$),"-");STR$(MAX.MSG.FILE.SIZE.FRM.DEF!)
  401.       PRINT "166. Maximum number of messages allowed ------------" + STR$(MAX.ALLOWED.MSGS.FRM.DEF)
  402.       PRINT "167. Conference File Maintenance.
  403.       GOTO 12580
  404. 12480 DISPLAYED.PAGE.NUMBER = 10
  405.       GOSUB 24800
  406.       RB = 0
  407.       LOCATE  3,1
  408.       PRINT "181. Pack " + MAIN.MESSAGE.FILE$ + " file.
  409.       PRINT "182. Rebuild " + MAIN.USER.FILE$ + " file.
  410.       PRINT "183. Print " + MAIN.MESSAGE.FILE$ + " 'header' records.
  411.       PRINT "184. Renumber messages in " + MAIN.MESSAGE.FILE$ + " file.
  412.       PRINT "185. Repair messages in " + MAIN.MESSAGE.FILE$ + " file.
  413.       PRINT "186. Make all users answer required questionnaire."
  414.       PRINT "187. Check FMS directory structure."
  415.       PRINT "188. Check Personal Download directory structure."
  416.       PRINT "189. Set most critical parameters."
  417.       PRINT "190. Set parameters new to RBBS-PC " + CONFIG.VERSION$
  418.       PRINT "191. Reset active printers for all nodes."
  419.       PRINT "192. Make user pref. on hilighting match color graphics."
  420.       GOTO 12580
  421. 12490 DISPLAYED.PAGE.NUMBER = 11
  422.       GOSUB 24800
  423.       LOCATE  3,1
  424.       PRINT "201. Drive available for uploading files to ------- " + DRIVE.FOR.UPLOADS$ + ":"
  425.       PRINT "202. File name of Upload Directory  --------------- " + UPLOAD.DIRECTORY$
  426.       PRINT "203. Drive/path where Upload Directory stored ----- " + UPLOAD.PATH$
  427.       X$ = ""
  428.       FOR I = 1 TO LEN(DRIVES.FOR.DOWNLOADS$)
  429.           X$ = X$ + MID$(DRIVES.FOR.DOWNLOADS$,I,1) + ":,"
  430.       NEXT
  431.       PRINT "204. Drive(s) available for Downloading ----------- " + MID$(X$,1,LEN(X$)-1)
  432.       PRINT "205. Will you be using DOS sub-directories? ------- " + MID$("NO YES",(WILL.SUBDIRS.B.USED*-3)+1,3)
  433.       PRINT "206. Write Uploads to a DOS sub-directory? -------- " + MID$("NO YES",(UPLOAD.TO.SUBDIR*-3)+1,3)
  434.       PRINT "207. Are downloads from DOS sub-directories? ------ " + MID$("NO YES",(DOWNLOAD.TO.SUBDIR*-3)+1,3)
  435.       PRINT "208. List, change, add, delete sub-directories."
  436.       PRINT "209. Extension for file directories --------------- " + DIRECTORY.EXTENTION$
  437.       X$ = ALTDIR.EXTENSION$
  438.       IF ALTDIR.EXTENSION$ = "" OR _
  439.          ALTDIR.EXTENSION$ = "<none>" THEN _
  440.          X$ = NONE.PICKED$
  441.       PRINT "210. Alternate extension for directory files ------ " + X$
  442.       PRINT "211. Name (prefix) of directory of directories ---- " + DIRECTORY.PREFIX$
  443.       PRINT "212. Omit directory of directories in N)ew cmnd. -- " + OMIT.MAIN.DIRECTORY$
  444.       X$ = ALWAYS.STREW.TO$
  445.       IF ALWAYS.STREW.TO$ = "" OR _
  446.          ALWAYS.STREW.TO$ = "<none>" THEN _
  447.          X$ = "NO"
  448.       PRINT "213. Copy all upload descriptions to -------------- " + X$
  449.       A$ = FMS.DIRECTORY$
  450.       IF FMS.DIRECTORY$ = "" THEN _
  451.          A$ = NONE.PICKED$
  452.       PRINT "214. Name of master File Management System dir is - " + A$
  453.       PRINT "215. Limit file searches to master FMS dir only --- " + MID$("NO YES",(LIMIT.SEARCH.TO.FMS*-3)+1,3)
  454.       PRINT "216. Default category code for uploads ------------ " + DEFAULT.CATEGORY.CODE$
  455.       PRINT "217. File containing valid directory categories --- " + DIR.CATEGORY.FILE$
  456.       X$ = MASTER.DIRECTORY.NAME$
  457.       IF MASTER.DIRECTORY.NAME$ = "" THEN _
  458.          X$ = "NO"
  459.       PRINT "218. Limit search for 'ALL' dirs to directory ----- " + X$
  460.       PRINT "219. Max length of description of uploaded file ---" + STR$(MAX.DESC.LEN)
  461.       PRINT "220. Drive/path(optional) for directory files ----- " + DIRECTORY.PATH$
  462.       GOTO 12580
  463. 12500 DISPLAYED.PAGE.NUMBER = 12
  464.       GOSUB 24800
  465.       LOCATE 3,1
  466.       PRINT "221. Communications port to be used by RBBS-PC ---- " + COM.PORT$
  467.       PRINT "222. # of seconds to wait for modem to initialize -" + STR$(MODEM.INIT.WAIT.TIME)
  468.       PRINT "223. Seconds to wait before issuing modem commands-" + STR$(MODEM.COMMAND.DELAY.TIME)
  469.       PRINT "224. Number of rings to wait before answering -----" + STR$(REQUIRED.RINGS);
  470.       IF INSTR(USER.INIT.COMMAND$, "S0=255 ") > 0 THEN _
  471.          PRINT " RING BACK";
  472.       PRINT "225. Use the RBBS-PC default Hayes commands? ------ " + M14$
  473.       PRINT "226. Is MICROCOM's MNP protocol available? -------- " + MID$("NO YES",(MNP.SUPPORT*-3)+1,3)
  474.       PRINT "227. Issue modem commands between rings ----------- " + MID$("NO YES",(COMMANDS.BETWEEN.RINGS*-3)+1,3)
  475.       PRINT "228. Baud rate to initially open modem at --------- " + MODEM.INIT.BAUD$
  476.       X$ = STR$(WAIT.BEFORE.DISCONNECT) + " seconds"
  477.       IF WAIT.BEFORE.DISCONNECT = 0 THEN _
  478.          X$ = "NO"
  479.       PRINT "229. Log off user who are idle for ----------------" + X$
  480.       PRINT "230. Are you using a 'DUMB' auto-answer modem? ---- " + MID$("NO YES",(DUMB.MODEM*-3)+1,3)
  481.       PRINT "231. Initialize Hayes 2400 firmware for RBBS-PC."
  482.       PRINT "232. # seconds to wait after dropping DTR ---------"  + STR$(DTR.DROP.DELAY)
  483.       PRINT "233. File with PROTOCOL definitions --------------- " + PROTO.DEF$
  484.       PRINT "234. Always check caller for AUTODOWNLOAD support - " + FNYESNO$(ASK.IDENTITY)
  485.       PRINT "235. Require non-ascii protocol for BASIC files --- " + MID$("NO YES",(REQUIRE.NON.ASCII*-3)+1,3)
  486.       X$ = STR$(RECYCLE.WAIT) + " minutes"
  487.       IF RECYCLE.WAIT = 0 THEN _
  488.          X$ = "<Don't recycle>"
  489.       PRINT "236. Recycle if no calls are received within ------" + X$
  490.       PRINT "237. Leave modem at initial baud ------------------ " + FNYESNO$(KEEP.INIT.BAUD)
  491.       GOTO 12580
  492. 12505 DISPLAYED.PAGE.NUMBER = 13
  493.       GOSUB 24800
  494.       LOCATE 3,1
  495.       PRINT "241. Restore initial parms. after change to N/8/1 - " + FNYESNO$(SWITCH.BACK)
  496.       PRINT "242. Minimum baud required of new callers ---------"  + STR$(MIN.NEWCALLER.BAUD)
  497.       PRINT "243. Minimum baud required of old callers ---------"  + STR$(MIN.OLDCALLER.BAUD)
  498.       PRINT "244. Modem flow control uses Clear-to-Send (CTS)--- " + RTS$
  499.       PRINT "245. Modem flow control uses XON/XOFF ------------- " + FNYESNO$(XON.XOFF)
  500.       PRINT "246. Seconds to wait for carrier after answering --"  + STR$(MAX.CARRIER.WAIT)
  501.       GOTO 12580
  502. 12510 DISPLAYED.PAGE.NUMBER = 14
  503.       GOSUB 24800
  504.       LOCATE 3,1
  505.       TIME.TO.DROP.TO.DOS$ = "<none>"
  506.       IF TIME.TO.DROP.TO.DOS > 0 THEN _
  507.          TIME.TO.DROP.TO.DOS$ = STRING$(4 - (LEN(STR$(TIME.TO.DROP.TO.DOS)) - 1),"0") + MID$(STR$(TIME.TO.DROP.TO.DOS),2)
  508. 12512 PRINT "261. Time of day to exit to DOS ------------------- " + TIME.TO.DROP.TO.DOS$
  509.       PRINT "262. Net mail to invoke is ------------------------ " + NET.MAIL$
  510.       X$ = HOST.ECHO.ON$
  511.       IF HOST.ECHO.ON$ = "" THEN _
  512.          X$ = NONE.PICKED$
  513.       PRINT "263. Command for intermediate host to ECHO -------- " + X$
  514.       X$ = HOST.ECHO.OFF$
  515.       IF HOST.ECHO.OFF$ = "" THEN _
  516.          X$ = NONE.PICKED$
  517.       PRINT "264. Ccommand for intermediate host NOT to ECHO --- " + X$
  518.       X = INSTR("ICR",DEFAULT.ECHOER$)
  519.       X$ = MID$("Intermediate hostCaller's softwareRBBS-PC",1 + 17 * (X - 1),17)
  520.       PRINT "265. Who echos what a remote caller types? -------- " + X$
  521.       X$ = DEFAULT.LINE.ACK$
  522.       IF DEFAULT.LINE.ACK$ = "" THEN _
  523.          X$ = NONE.PICKED$
  524.       PRINT "266. String to acknowlege line in ASCII upload ---- "+ X$
  525.       GOTO 12580
  526. 12520 DISPLAYED.PAGE.NUMBER = 15
  527.       GOSUB 24800
  528.       LOCATE  3,1
  529.       PRINT "281. Let new users set their preferences --------- " + MID$("NO YES",(NEWUSER.SETS.DEFAULTS*-3)+1,3)
  530.       PRINT "282. New users default sign-on mode -------------- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.MODE$
  531.       PRINT "283. New users default file-transfer protocol ---- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.PROTOCOL$
  532.       PRINT "284. Line feeds for new users default to --------- " + NOT.YET.IN$ ' NEW.USER.LINE.FEEDS$
  533.       PRINT "285. Nulls for new users default to -------------- " + NOT.YET.IN$ ' NEW.USER.NULLS$
  534.       PRINT "286. Prompt bell for new users defaults to ------- " + NOT.YET.IN$ ' NEW.USER.BELL$
  535.       PRINT "287. New users 'graphics' capability is assumed -- " + NOT.YET.IN$ ' NEW.USER.GRAPHICS$
  536.       PRINT "288. New users are assumed UPPERCASE only -------- " + NOT.YET.IN$ ' NEW.USER.CASE$
  537.       PRINT "289. New users message margins defaults to ------- " + NOT.YET.IN$ ' STR$(NEW.USER.MARGINS)
  538.       PRINT "290. Add new users to USERS file ----------------- " + MID$("NO YES",(REMEMBER.NEW.USERS*-3)+1,3)
  539.       PRINT "291. Let new users on even when USERS file full -- " + MID$("NO YES",(SURVIVE.NOUSER.ROOM*-3)+1,3)
  540.       GOTO 12580
  541. 12530 DISPLAYED.PAGE.NUMBER = 16
  542.       GOSUB 24800
  543.       LOCATE  3,1
  544.       X$ = LIBRARY.DRIVE$
  545.       IF LIBRARY.DRIVE$ = "" THEN _
  546.          X$ = NONE.PICKED$
  547.       PRINT "301. Library drive ------------------------------- " + X$
  548.       PRINT "302. Drive/Path for Library directory ------------ " + LIBRARY.DIRECTORY.PATH$
  549.       PRINT "303. Extension for Library directory ------------- " + LIBRARY.DIRECTORY.EXTENTION$
  550.       PRINT "304. Drive/Path for Library work/RAM disk -------- " + LIBRARY.WORK.DISK.PATH$
  551.       PRINT "305. # of disks in Library -----------------------" + STR$(LIBRARY.MAX.DISK)
  552.       PRINT "306. # of master Library subdirectories ----------" + STR$(LIBRARY.MAX.DIRECTORY)
  553.       PRINT "307. # of subdirectories in each master ----------" + STR$(LIBRARY.MAX.SUBDIR)
  554.       PRINT "308. Prefix of Library subdirectories ------------ " + LIBRARY.SUBDIR.PREFIX$
  555.       PRINT "309. Name of Library subsystem command menu ------ " + MENU$(6)
  556.       PRINT "310. Symbols to use for Library menu commands ---- " + LIBRARY.COMMANDS$
  557.       M27$ = STR$(PS)
  558.       IX = LIBRARY.FUNCTION(1)
  559.       FOR I = 1 TO NUM.LIBRARY
  560.          IF IX<>LIBRARY.FUNCTION(I) THEN _
  561.             M27$ = "(Variable)" : _
  562.             GOTO 12531
  563.       NEXT
  564. 12531 PRINT "311. Security level for Library menu functions --- " + M27$
  565.       PRINT "312. Drive/Path of archive utility --------------- " + LIBRARY.ARCHIVE.PATH$
  566.       PRINT "313. Name of executable archive utility ---------- " + LIBRARY.ARCHIVE.PROGRAM$
  567.       GOTO 12580
  568. 12540 DISPLAYED.PAGE.NUMBER = 17
  569.       GOSUB 24800
  570.       LOCATE  3,1
  571.       X$ = EMPHASIZE.ON.DEF$
  572.       IF EMPHASIZE.ON.DEF$ = "" THEN _
  573.          X$ = NONE.PICKED$
  574.       PRINT "321. String to turn ON Graphic Emphasis ----------- " + X$
  575.       X$ = EMPHASIZE.OFF.DEF$
  576.       IF EMPHASIZE.OFF.DEF$ = "" THEN _
  577.          X$ = NONE.PICKED$
  578.       PRINT "322. String to restore normal text (Emphasis OFF) - " + X$
  579.       PRINT "323. Caller's Foreground color 1 ------------------ " + FG.1.DEF$
  580.       PRINT "324. Caller's Foreground color 2 ------------------ " + FG.2.DEF$
  581.       PRINT "325. Caller's Foreground color 3 ------------------ " + FG.3.DEF$
  582.       PRINT "326. Caller's Foreground color 4 ------------------ " + FG.4.DEF$
  583.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",CALLER.BKGRD*6+1,6)
  584.       PRINT "327. Caller's Background color -------------------- " ; X$
  585.       GOTO 12580
  586. 12550 DISPLAYED.PAGE.NUMBER = 18
  587.       GOSUB 24800
  588.       GOTO 12580
  589. 12580 IF PRE.DISPLAY THEN _
  590.          PRE.DISPLAY = FALSE : _
  591.          GOTO 12622
  592.       GOSUB 24890
  593. 12590 GOSUB 22160
  594. 12592 IF IX THEN _            'IX       Key    Where to branch to
  595.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  596.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  597.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  598.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  599.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  600.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  601.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  602.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  603.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  604.                     12480, _  '10      F10 - RBBS-PC's utilities
  605.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  606.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  607.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  608.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  609.                     12520, _  '15 Shift-F5 - New user parameters
  610.                     12530, _  '16 Shift-F6 - Library parameters
  611.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  612.                     12310, _  '18 Shift-F8 - Reserved for future use
  613.                     12340, _  '19     PgUp - Go to previous page
  614.                     12330, _  '20     PgDn - Go to next page
  615.                     12630, _  '21      End - Terminate CONFIG
  616.                     12620     '22 Enter - Option selected followed by "enter"
  617.       GOTO 12590
  618. 12620 GOSUB 50340
  619.       IF VAL(HJ$) < 1 OR VAL(HJ$) > 331 THEN _
  620.          GOTO 12580
  621.       IPAGE = INT((VAL(HJ$) - 1) / 20)
  622.       IF DISPLAYED.PAGE.NUMBER <> IPAGE+1 THEN _
  623.          PRE.DISPLAY = TRUE : _
  624.          IX = IPAGE+1 : _
  625.          GOTO 12592
  626. 12622 ILOOKUP = VAL(HJ$) - (20 * IPAGE)
  627.       IPAGE = IPAGE + 1
  628.       IF ILOOKUP < 1 THEN _
  629.          ILOOKUP = 20 : _
  630.          IPAGE = IPAGE - 1
  631. 12630 EXIT SUB
  632. '
  633. ' * COMMON SUBROUTINE TO HANDLE THE FUNCTION KEYS, SCROLL BETWEEN CONFIG'S
  634. ' * PAGES OF OPTIONS, AND USER'S SELECTING A NUMERIC 4-CHARACTER OPTION.
  635. '
  636. 22160 I! = FRE(C$)
  637.       IX = 0
  638.       IF KSTACKED$ = "" THEN _
  639.          GOTO 22161
  640.       X = INSTR(KSTACKED$,CHR$(13))
  641.       IF X > 0 THEN _
  642.          IX = 22 : _
  643.          HJ$ = LEFT$(KSTACKED$,X-1) : _
  644.          KSTACKED$ = RIGHT$(KSTACKED$,LEN(KSTACKED$)-X) : _
  645.          OPTION$ = HJ$ : _
  646.          RETURN
  647.       Y$ = CHR$(0) + CHR$(68)
  648.       IF KSTACKED$ = "END" THEN _
  649.          Y$ = CHR$(0) + CHR$(79)
  650.       KSTACKED$ = ""
  651.       GOTO 22240
  652. 22161 Y$ = INKEY$
  653.       IF LEN(Y$) < 1 THEN _
  654.          GOTO 22161
  655.       IF LEN(Y$) = 2 THEN _               ' IF A FUNCTION KEY, BRANCH
  656.          GOTO 22240
  657.       IF ASC(Y$) = 13 THEN _              ' IF A CARRIAGE RETURN, RETURN
  658.          IX = 22 : _
  659.          RETURN
  660.       IF ASC(Y$) = 8 AND LEN(HJ$) > 0 THEN _
  661.          HJ$ = LEFT$(HJ$,LEN(HJ$) - 1) : _
  662.          PRINT CHR$(29) + " " + CHR$(29); : _
  663.          GOTO 22161
  664.       IF ASC(Y$) < 48 OR ASC(Y$) > 57 THEN _
  665.          GOTO 22161
  666.       PRINT Y$;
  667.       HJ$ = HJ$ + _
  668.             Y$
  669.       OPTION$ = HJ$
  670.       IF LEN(HJ$) > 4 THEN _              ' IF MORE THAN FOUR CHARACTERS,
  671.          IX = 22                          ' RETURN
  672.       RETURN
  673. '
  674. ' * COMMON SUBROUTINE TO HANDLE SET UP RETURN CODES FOR FUNCTION KEYS THAT
  675. ' * WERE PRESSED ON THE LOCAL PC RUNNING CONFIG
  676. '
  677. 22240 IX = ASC(RIGHT$(Y$,1))
  678.       IF IX < 59 OR IX > 91 THEN _        ' IGNORE IF NOT F1 THROUGH F10 OR
  679.          IX = 0: _                        ' SHIFT-F1 THROUGH SHIFT-F8
  680.          RETURN
  681.       IF IX = 73 THEN _                   ' IF PGUP THEN SET IX = 19
  682.          IX = 19 : _
  683.          RETURN
  684.       IF IX = 79 THEN _                   ' IF END THEN SET IX = 21
  685.          IX = 21 : _
  686.          RETURN
  687.       IF IX = 81 THEN _                   ' IF PGDN THEN SET IX = 20
  688.          IX = 20 : _
  689.          RETURN
  690.       IF (IX-58) < 11 THEN _              ' IF F1 THROUGH F10 SET IX = 1
  691.          IX = IX - 58 : _                 ' THROUGH 10 ACCORDINGLY.
  692.          RETURN
  693.       IF (IX-73) > 10 AND _               ' IF SHIFT-F1 THROUGH SHIFT-F8 THEN
  694.          (IX-73) < 19 THEN _              ' SET IX = 11 THROUGH 18
  695.             IX = IX - 73 : _              ' ACCORDINGLY.
  696.             RETURN
  697.       IX = 0
  698.       RETURN
  699. '
  700. ' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
  701. '
  702. 24800 CLS
  703.       I! = FRE(C$)
  704.       COLOR 0,7,0
  705.       LOCATE 1,10
  706.       PRINT "RBBS-PC " + CONFIG.VERSION$ + " Configuration ";
  707.       IF CONFERENCE.MODE THEN _
  708.          GOSUB 24970
  709.       COLOR FG,BG,BORDER
  710.       PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
  711.       RETURN
  712. 24890 A$ = "Enter parameter # to change, END to update, PgUp/PgDn to scroll:"
  713. 24900 LOCATE 24,5
  714.       PRINT A$;
  715.       X = POS(0) + 2
  716.       PRINT STRING$((75 - LEN(A$)),32);
  717.       LOCATE 24,X
  718.       COLOR FG,BG,BORDER
  719.       HJ$ = "
  720.       I! = FRE(C$)
  721.       RETURN
  722. '
  723. ' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
  724. '
  725. 24970 LOCATE 2,1
  726.       PRINT SPACE$(10)
  727.       LOCATE 2,10
  728.       A$ = "Private"
  729.       IF CONFERENCE.MODE = 2 THEN _
  730.          A$ = "Public"
  731.       COLOR 31,0,0
  732.       PRINT "(" + A$ + " Conference Maintenance Mode for " + _
  733.             MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF")-1) + _
  734.             ")";
  735.       RETURN
  736. '
  737. ' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
  738. '
  739. 30040 OPEN "R",2,MAIN.MESSAGE.FILE$,128        ' <---- read MESSAGES checkpoint record
  740.       FIELD 2,128 AS RR$
  741.       GET 2,1
  742.       CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8  =  number of last message on system
  743.       FIRST.USER.RECORD = VAL(MID$(RR$,52,5))        ' 52- 56  =  first rec. of user file
  744.       CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61  =  next avail. user record
  745.       HIGHEST.USER.RECORD = VAL(MID$(RR$,62,5))      ' 62- 66  =  last rec. of user file
  746.       FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
  747.       NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
  748.       HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
  749.       MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
  750.       MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
  751.       CLOSE 2
  752.       RETURN
  753. '
  754. ' * COMMON ROUTINE TO GET THE LENGTH OF A FILE
  755. '
  756. 30180 OPEN "R",2,FILE$,128      ' <---- get length of file
  757.       FIELD 2,128 AS RR$
  758.       UG = LOF(2) / 128
  759.       CLOSE 2
  760.       RETURN
  761. '
  762. ' * COMMON SUBROUTINE TO KEEP STRING SPACE CLEAN AND CLEAR LINE 24
  763. '
  764. 50340 I! = FRE(C$)
  765.       LOCATE 24,1
  766.       PRINT STRING$(79,32);
  767.       RETURN
  768. '
  769. ' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
  770. '
  771. 50345 GOSUB 50340
  772.       LOCATE 24,5
  773.       PRINT XX$;
  774.       RETURN
  775. '
  776. ' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
  777. '
  778. 60380 FOR I = 1 TO 3
  779.         BEEP
  780.       NEXT
  781.       RETURN
  782.       END SUB
  783. '  $SUBTITLE: 'NETTYPE - subroutine to select supported networks'
  784. '  $PAGE
  785. '
  786. '  SUBROUTINE NAME    --  NETTYPE
  787. '
  788. '  INPUT PARAMETERS   --  MLCOM
  789. '                         NETWORK.TYPE
  790. '                         NETWORK.TYPE$
  791. '                         SUBROUTINE.PARAMETER
  792. '
  793. '  OUTPUT PARAMETERS  --  MLCOM
  794. '                         NETWORK.TYPE
  795. '                         NETWORK.TYPE$
  796. '
  797. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED NETWORKS
  798. '
  799.       SUB NETTYPE STATIC
  800.       ON SUBROUTINE.PARAMETER GOTO 60382,60384
  801. 60382 CLS
  802.       LOCATE 3,1
  803.       PRINT "     RBBS-PC is supported in the following:"
  804.       PRINT "                   Environment"
  805.       PRINT "          0. Single RBBS-PC in an IBM DOS environment"
  806.       PRINT "          1. MultiLink (multi-tasking under single DOS)"
  807.       PRINT "          2. Omninet (CORVUS)"
  808.       PRINT "          3. PC-NET (Orchid)"
  809.       PRINT "          4. DESQview (Quarterdeck)"
  810.       PRINT "          5. 10 NET (Fox Research)"
  811.       PRINT "          6. NETBIOS (DOS SHARE)"
  812.       PRINT "          7. DoubleDOS, but file sharing not supported."
  813. 60383 XX$ = "Select environment (0 to 7, [ENTER] quits)"
  814.       I! = FRE(C$)
  815.       LOCATE 24,1
  816.       PRINT STRING$(79,32);
  817.       LOCATE 24,5
  818.       PRINT XX$;
  819.       LINE INPUT;X$
  820.       IF X$ = "" THEN _
  821.          EXIT SUB
  822.       NETWORK.TYPE = VAL(X$)
  823.       IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  824.          GOTO 60383
  825. 60384 IF NETWORK.TYPE = 0 THEN _
  826.          NETWORK.TYPE$ = "IBM's DOS"
  827.       IF NETWORK.TYPE = 1 THEN _
  828.          NETWORK.TYPE$ = "MultiLink"
  829.       IF NETWORK.TYPE = 2 THEN _
  830.          NETWORK.TYPE$ = "Omninet"
  831.       IF NETWORK.TYPE = 3 THEN _
  832.          NETWORK.TYPE$ = "PC-NET"
  833.       IF NETWORK.TYPE = 4 THEN _
  834.          NETWORK.TYPE$ = "DESQview"
  835.       IF NETWORK.TYPE = 5 THEN _
  836.          NETWORK.TYPE$ = "10 NET"
  837.       IF NETWORK.TYPE = 6 THEN _
  838.          NETWORK.TYPE$ = "NETBIOS"
  839.       IF NETWORK.TYPE = 7 THEN _
  840.          NETWORK.TYPE$ = "No file sharing!"
  841.       IF SUBROUTINE.PARAMETER = 2 THEN _
  842.          EXIT SUB
  843.       IF NETWORK.TYPE > 1 AND NETWORK.TYPE < 7 THEN _
  844.          CALL GETNUMYN ("Are you running Multi-Link with " + NETWORK.TYPE$,MLCOM)
  845.       END SUB
  846. '  $SUBTITLE: 'CNFGINIT - subroutine to initialize CONFIG's constants'
  847. '  $PAGE
  848. '
  849. '  SUBROUTINE NAME    --  CNFGINIT
  850. '
  851. '  INPUT PARAMETERS   --  NONE
  852. '
  853. '  OUTPUT PARAMETERS  --  CONFIG'S CONSTANTS INITIALIZED
  854. '
  855. '  SUBROUTINE PURPOSE --  TO INITIALIZE THE CONSTANTS USED BY CONFIG
  856. '
  857. 60385 SUB CNFGINIT STATIC
  858. '
  859. ' * INITALIZE ALL VARIABLES IF A .DEF FILE DOESN'T AREADY EXIST
  860. '
  861.       D$                         = DD$ + ":"
  862.       FALSE                      = 0
  863.       TRUE                       = NOT FALSE
  864.       SYSOP.SECURITY.LEVEL       = 10
  865.       ACT.MNTHS.B4.DELETING      = 1
  866.       ACTIVE.BULLETINS           = 6
  867.       ADD.DIR.SECURITY           = SYSOP.SECURITY.LEVEL
  868.       ALLOW.CALLER.TURBO         = 6
  869.       ALTDIR.EXTENSION$          = ""
  870.       ALWAYS.STREW.TO$           = ""
  871.       ANS.MENU$                  = D$ + "MENUA"
  872.       ASK.EXTENDED.DESC          = SYSOP.SECURITY.LEVEL
  873.       ASK.IDENTITY               = FALSE
  874.       AUTO.ADD.SECURITY          = 5
  875.       AUTOPAGE.DEF$              = D$ + "AUTOPAGE.DEF"
  876.       BG                         = 0
  877.       BORDER                     = 0
  878.       BUFFER.SIZE                = 128
  879.       BULLETIN.MENU$             = "BULLET"
  880.       BULLETIN.PREFIX$           = "BULLET"
  881.       BULLETINS.OPTIONAL         = TRUE
  882.       C$                         = ""
  883.       CALLER.BKGRD               = 0
  884.       CALLERS.FILE$              = D$ + "CALLERS"
  885.       COM.PORT$                  = "COM1"
  886.       COMMANDS.BETWEEN.RINGS     = FALSE
  887.       COMMANDS.IN.PROMPT         = TRUE
  888.       COMMENTS.AS.MESSAGES       = FALSE
  889.       COMMENTS.FILE$             = D$ + "COMMENTS"
  890.       COMPUTER.TYPE              = 0
  891.       CONFERENCE.MENU$           = D$ + "CONFENCE"
  892.       CONFERENCE.VIEWER.SEC.LVL  = 0
  893.       CONFMAIL.LIST$             = D$ + "CONFMAIL.DEF"
  894.       CONFIG.VERSION$            = "(Version CPC17-1A)"
  895.       DEFAULT.CATEGORY.CODE$     = "UC "
  896.       DAYS.IN.SUBSCRIPTION.PERIOD = 365
  897.       DAYS.TO.WARN               = 60
  898.       DIR.CATEGORY.FILE$         = D$ + "DIR.CAT"
  899.       DIRECTORY.PREFIX$          = "DIR"
  900.       DEFAULT.ECHOER$            = "R"
  901.       DEFAULT.LINE.ACK$          = ""
  902.       DEFAULT.SECURITY.LEVEL     = 5
  903.       DIRECTORY.EXTENTION$       = "DIR"
  904.       DIRECTORY.PATH$            = D$
  905.       DISK.FOR.DOS$              = D$
  906.       DISKFULL.GO.OFFLINE        = TRUE
  907.       DNLD.SUB                   = 0
  908.       DOORS.AVAILABLE            = FALSE
  909.       DOORS.TERMINAL.TYPE        = 8
  910.       DOSANSI                    = FALSE
  911.       DOS.VERSION                = 2
  912.       DOWNLOAD.DRIVES$           = DD$ + DD$
  913.       DOWNLOAD.TO.SUBDIR         = FALSE
  914.       DRIVE.FOR.BULLETINS$       = D$
  915.       DRIVE.FOR.HELP.FILES$      = D$
  916.       DTR.DROP.DELAY             = 3
  917.       DUMB.MODEM                 = FALSE
  918.       ECHOER$                    = "R"
  919.       EMPHASIZE.OFF.DEF$         = "[27]" + "[0;40;33m"
  920.       EMPHASIZE.ON.DEF$          = "[27]" + "[1;41;37m"
  921.       END.OFFICE.HOURS           = 2200
  922.       ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
  923.       EPILOG$                    = D$ + "EPILOG.DEF"
  924.       ESCAPE.INSECURE            = FALSE
  925.       EXPERT.USER                = 0
  926.       EXPIRED.SECURITY           = DEFAULT.SECURITY.LEVEL
  927.       EXTENDED.LOGGING           = FALSE
  928.       FC                         = 5
  929.       FG                         = 7
  930.       FG.1.DEF$                  = "Bright Green"
  931.       FG.2.DEF$                  = "Bright Yellow"
  932.       FG.3.DEF$                  = "Bright Purple"
  933.       FG.4.DEF$                  = "Bright Cyan"
  934.       FILE.COMMANDS.DEFAULTS$    = "DGLNPSUV"
  935.       FILE.COMMANDS$             = FILE.COMMANDS.DEFAULTS$
  936.       FILE.NOTIFY                = FALSE
  937.       FILES.FUNCTION$(1,1)       = "D)ownload a file      "
  938.       FILES.FUNCTION$(2,1)       = "G)oodbye              "
  939.       FILES.FUNCTION$(3,1)       = "L)ist file directory  "
  940.       FILES.FUNCTION$(4,1)       = "N)ew file search      "
  941.       FILES.FUNCTION$(5,1)       = "P)ersonal files       "
  942.       FILES.FUNCTION$(6,1)       = "S)earch files         "
  943.       FILES.FUNCTION$(7,1)       = "U)pload a file        "
  944.       FILES.FUNCTION$(8,1)       = "V)erbose ARC list     "
  945.       FILES.FUNCTION$(1,2)       = "D"
  946.       FILES.FUNCTION$(2,2)       = "G"
  947.       FILES.FUNCTION$(3,2)       = "L"
  948.       FILES.FUNCTION$(4,2)       = "N"
  949.       FILES.FUNCTION$(5,2)       = "P"
  950.       FILES.FUNCTION$(6,2)       = "S"
  951.       FILES.FUNCTION$(7,2)       = "U"
  952.       FILES.FUNCTION$(8,2)       = "V"
  953.       FILESEC.FILE$              = D$ + "FILESEC"
  954.       FIRST.NAME.PROMPT$         = "FIRST name"
  955.       FOSSIL                     = 0
  956.       GB                         = FC
  957.       GLOBAL.COMMANDS.DEFAULTS$  = "H?QX"
  958.       GLOBAL.COMMANDS$           = GLOBAL.COMMANDS.DEFAULTS$
  959.       GLOBAL.FUNCTION$(1,1)      = "H)elp on-line           "
  960.       GLOBAL.FUNCTION$(2,1)      = "?)help on-line (=H)     "
  961.       GLOBAL.FUNCTION$(3,1)      = "Q)uit this part         "
  962.       GLOBAL.FUNCTION$(4,1)      = "X)Expert toggle on/off  "
  963.       GLOBAL.FUNCTION$(1,2)      = "H"
  964.       GLOBAL.FUNCTION$(2,2)      = "?"
  965.       GLOBAL.FUNCTION$(3,2)      = "Q"
  966.       GLOBAL.FUNCTION$(4,2)      = "X"
  967.       GO.TO.SHELL                = TRUE
  968.       HELP$(3)                   = "HELP03"
  969.       HELP$(4)                   = "HELP04"
  970.       HELP$(7)                   = "HELP07"
  971.       HELP$(9)                   = "HELP09"
  972.       HELP.EXTENSION$            = "HLP"
  973.       HELP.FILE.PREFIX$          = "HELP0"
  974.       HELP.PATH$                 = D$
  975.       HOST.ECHO.OFF$             = ""
  976.       HOST.ECHO.ON$              = ""
  977.       IB                         = 0
  978.       KEEP.INIT.BAUD             = FALSE
  979.       KEEP.TIME.CREDITS          = FALSE
  980.       LAST.NAME.PROMPT$          = "LAST name"
  981.       LEN.HASH                   = 31
  982.       LEN.INDIV                  = 0
  983.       LIBRARY.ARCHIVE.PATH$        = D$
  984.       LIBRARY.ARCHIVE.PROGRAM$     = "ARCA "
  985.       LIBRARY.COMMANDS.DEFAULTS$   = "ACDGLSV"
  986.       LIBRARY.COMMANDS$            = LIBRARY.COMMANDS.DEFAULTS$
  987.       LIBRARY.DRIVE$               = ""
  988.       LIBRARY.MAX.DISK             = 705
  989.       LIBRARY.MAX.DIRECTORY        = 7
  990.       LIBRARY.MAX.SUBDIR           = 100
  991.       LIBRARY.SUBDIR.PREFIX$       = "DISK"
  992.       LIBRARY.DIRECTORY.PATH$      = D$
  993.       LIBRARY.DIRECTORY.EXTENTION$ = "CDR"
  994.       LIBRARY.FUNCTION$(1,1)       = "A)rchive a Library disk  "
  995.       LIBRARY.FUNCTION$(2,1)       = "C)hange Library disk     "
  996.       LIBRARY.FUNCTION$(3,1)       = "D)ownload a file         "
  997.       LIBRARY.FUNCTION$(4,1)       = "G)oodbye                 "
  998.       LIBRARY.FUNCTION$(5,1)       = "L)ist a file directory   "
  999.       LIBRARY.FUNCTION$(6,1)       = "S)earch files            "
  1000.       LIBRARY.FUNCTION$(7,1)       = "V)erbose ARC list        "
  1001.       LIBRARY.FUNCTION$(1,2)       = "A"
  1002.       LIBRARY.FUNCTION$(2,2)       = "C"
  1003.       LIBRARY.FUNCTION$(3,2)       = "D"
  1004.       LIBRARY.FUNCTION$(4,2)       = "G"
  1005.       LIBRARY.FUNCTION$(5,2)       = "L"
  1006.       LIBRARY.FUNCTION$(6,2)       = "S"
  1007.       LIBRARY.FUNCTION$(7,2)       = "V"
  1008.       LIBRARY.WORK.DISK.PATH$      = D$
  1009.       LIMIT.SEARCH.TO.FMS        = FALSE
  1010.       LOGON.MAIL.LEVEL$          = "A"
  1011.       LSB                        = 1016
  1012.       MACRO.DRVPATH$             = D$
  1013.       MACRO.EXTENSION$           = "MCR"
  1014.       MAIN.COMMANDS.DEFAULTS$    = "ABCDEFIJKOPRSTUVW@"
  1015.       MAIN.COMMANDS$             = MAIN.COMMANDS.DEFAULTS$
  1016.       MAIN.FUNCTION$(1,1)        = "A)nswer questionnaire  "
  1017.       MAIN.FUNCTION$(2,1)        = "B)ulletins             "
  1018.       MAIN.FUNCTION$(3,1)        = "C)omments              "
  1019.       MAIN.FUNCTION$(4,1)        = "D)oor subsystem        "
  1020.       MAIN.FUNCTION$(5,1)        = "E)nter message         "
  1021.       MAIN.FUNCTION$(6,1)        = "F)iles subsystem       "
  1022.       MAIN.FUNCTION$(7,1)        = "I)nitial welcome       "
  1023.       MAIN.FUNCTION$(8,1)        = "J)oin a conference     "
  1024.       MAIN.FUNCTION$(9,1)        = "K)ill messages         "
  1025.       MAIN.FUNCTION$(10,1)       = "O)perator page         "
  1026.       MAIN.FUNCTION$(11,1)       = "P)ersonal mail         "
  1027.       MAIN.FUNCTION$(12,1)       = "R)ead messages         "
  1028.       MAIN.FUNCTION$(13,1)       = "S)can messages header  "
  1029.       MAIN.FUNCTION$(14,1)       = "T)opic msg scan        "
  1030.       MAIN.FUNCTION$(15,1)       = "U)tilities subsystem   "
  1031.       MAIN.FUNCTION$(16,1)       = "V)iew conference mail  "
  1032.       MAIN.FUNCTION$(17,1)       = "W)ho's on other nodes  "
  1033.       MAIN.FUNCTION$(18,1)       = "@)Library subsystem    "
  1034.       MAIN.FUNCTION$(1,2)        = "A"
  1035.       MAIN.FUNCTION$(2,2)        = "B"
  1036.       MAIN.FUNCTION$(3,2)        = "C"
  1037.       MAIN.FUNCTION$(4,2)        = "D"
  1038.       MAIN.FUNCTION$(5,2)        = "E"
  1039.       MAIN.FUNCTION$(6,2)        = "F"
  1040.       MAIN.FUNCTION$(7,2)        = "I"
  1041.       MAIN.FUNCTION$(8,2)        = "J"
  1042.       MAIN.FUNCTION$(9,2)        = "K"
  1043.       MAIN.FUNCTION$(10,2)       = "O"
  1044.       MAIN.FUNCTION$(11,2)       = "P"
  1045.       MAIN.FUNCTION$(12,2)       = "R"
  1046.       MAIN.FUNCTION$(13,2)       = "S"
  1047.       MAIN.FUNCTION$(14,2)       = "T"
  1048.       MAIN.FUNCTION$(15,2)       = "U"
  1049.       MAIN.FUNCTION$(16,2)       = "V"
  1050.       MAIN.FUNCTION$(17,2)       = "W"
  1051.       MAIN.MESSAGE.BACKUP$       = D$ + "MESSAGES.BAK"
  1052.       MAIN.MESSAGE.FILE$         = D$ + "MESSAGES"
  1053.       MAIN.PUI$                  = D$ + "MAIN.PUI"
  1054.       MAIN.USER.FILE$            = D$ + "USERS"
  1055.       MASTER.DIRECTORY.NAME$     = ""
  1056.       MAX.ALLOWED.MSGS.FRM.DEF   = 5
  1057.       MAX.CARRIER.WAIT           = 30
  1058.       MAX.DESC.LEN               = 40
  1059.       MAX.EXTENDED.LINES         = 2
  1060.       MAX.MESSAGE.LINES          = 19
  1061.       MAX.PER.DAY                = 0
  1062.       MAX.USR.FILE.SIZE.FRM.DEF  = 16
  1063.       MAXD                       = SYSOP.SECURITY.LEVEL
  1064.       MAXIMUM.DISPLAYABLE.PAGES  = 17
  1065.       MAXIMUM.PASSWORD.CHANGES   = 3
  1066.       MAXIMUM.VIOLATIONS         = 5
  1067.       MAXIMUM.NUMBER.OF.NODES    = 1
  1068.       MENU$(1)                   = D$ + "MENU1"
  1069.       MENU$(2)                   = D$ + "MENU2"
  1070.       MENU$(3)                   = D$ + "MENU3"
  1071.       MENU$(4)                   = D$ + "MENU4"
  1072.       MENU$(5)                   = D$ + "MENU5"
  1073.       MENU$(6)                   = D$ + "MENU6"
  1074.       MENUS.CAN.PAUSE            = TRUE
  1075.       MESSAGE.REMINDER           = TRUE
  1076.       MIN.NEWCALLER.BAUD         = 0
  1077.       MIN.OLDCALLER.BAUD         = 0
  1078.       MIN.SEC.TO.VIEW            = DEFAULT.SECURITY.LEVEL
  1079.       MINIMUM.LOGON.SECURITY     = 0
  1080.       MINIMUM.SECURITY.FOR.TEMP.PASSWORD = 5
  1081.       MINUTES.PER.SESSION!       = 72
  1082.       MLCOM                      = FALSE
  1083.       MM                         = 5
  1084.       MNP.SUPPORT                = FALSE
  1085.       MO$                        = DD$
  1086.       MODEM.ANSWER.COMMAND$      = "ATQ0X1V1A"
  1087.       MODEM.COMMAND.DELAY.TIME   = 1
  1088.       MODEM.COUNT.RINGS.COMMAND$ = "ATS1?"
  1089.       MODEM.GO.OFFHOOK.COMMAND$  = "ATQ1E1H1M0"
  1090.       MODEM.INIT.BAUD$           = "300"
  1091.       MODEM.INIT.COMMAND$        = "ATM0Q1S2=255S10=30E0Q0X1S0=254  "
  1092.       MODEM.INIT.WAIT.TIME       = 2
  1093.       MODEM.RESET.COMMAND$       = "ATZ"
  1094.       MUSIC                      = FALSE
  1095.       NET.MAIL$                  = "<none>"
  1096.       NETWORK.TYPE               = 0
  1097.       NETWORK.TYPE$              = "IBM's DOS"
  1098.       NEW.FILES.CHECK            = FALSE
  1099.       NEW.USER.QUESTIONNAIRE$    = D$ + "RBBS-REG.DEF"
  1100.       NEWUSER.FILE$              = D$ + "NEWUSER"
  1101.       NEWUSER.SETS.DEFAULTS      = TRUE
  1102.       OMIT.MAIN.DIRECTORY$       = "NO"
  1103.       OMIT.UPLOAD.DIRECTORY$     = "NO"
  1104.       OVERWRITE.SECURITY.LEVEL   = SYSOP.SECURITY.LEVEL
  1105.       PAGE.LENGTH                = 23
  1106.       PAGING.PRINTER.SUPPORT$    = ". "
  1107.       PASSWORD.FILE$             = D$ + "PASSWRDS"
  1108.       PCJR                       = FALSE
  1109.       PERSONAL.BEGIN             = 1
  1110.       PERSONAL.DIR$              = "PRIV.DEF"
  1111.       PERSONAL.DRVPATH$          = D$
  1112.       PERSONAL.LEN               = 31
  1113.       PERSONAL.CONCAT            = FALSE
  1114.       PRELOG$                    = D$ + "PRELOG"
  1115.       PRIVATE.READ.SEC           = DEFAULT.SECURITY.LEVEL
  1116.       PROTO.DEF$                 = D$ + "PROTO.DEF"
  1117.       PROMPT.BELL                = 0
  1118.       PROMPT.HASH$               = "Name"
  1119.       PROMPT.INDIV$              = ""
  1120.       PS                         = 5
  1121.       PUBLIC.READ.SEC            = DEFAULT.SECURITY.LEVEL
  1122.       QUES.PATH$                 = D$
  1123.       RBBS.BAT$                  = D$ + "RBBS" + NODE.ID$ + ".BAT"
  1124.       RBBS.NAME$                 = "RBBS-PC"
  1125.       RCTTY.BAT$                 = D$ + "RCTTY" + NODE.ID$ + ".BAT"
  1126.       RECYCLE.TO.DOS             = 0
  1127.       RECYCLE.TO.DOS$            = "INTERNAL"
  1128.       RECYCLE.WAIT               = 0
  1129.       REDIRECT.IO.METHOD         = TRUE
  1130.       REGISTRATION.PROGRAM$      = "<none>"
  1131.       REMEMBER.NEW.USERS         = TRUE
  1132.       REMIND.FILE.TRANSFERS      = FALSE
  1133.       REMIND.PROFILE             = FALSE
  1134.       REQUIRE.NON.ASCII          = TRUE
  1135.       REQUIRED.QUESTIONNAIRE$    = "<none>"
  1136.       REQUIRED.RINGS             = 1
  1137.       RESTRICT.BAUD              = FALSE
  1138.       RESTRICT.BY.DATE           = FALSE
  1139.       RESTRICT.VALID.CMDS        = FALSE
  1140.       RTS$                       = "NO"
  1141.       SEC.CHANGE.MSG             = SYSOP.SECURITY.LEVEL
  1142.       SEC.LVL.EXEMPT.FRM.PURGING = SYSOP.SECURITY.LEVEL
  1143.       SECVIO.HLP$                = D$ + "SECVIO." + HELP.EXTENSION$
  1144.       SECURITY.EXEMPT.FROM.EPILOG= DEFAULT.SECURITY.LEVEL + 1
  1145.       SF                         = SYSOP.SECURITY.LEVEL
  1146.       SHOOT.YOURSELF             = FALSE
  1147.       SHOW.SECTION               = TRUE
  1148.       SIZE.OF.STACK              = 1024
  1149.       SL.CATEGORIZE.UPLOADS      = SYSOP.SECURITY.LEVEL
  1150.       SMART.TEXT                 = 123
  1151.       START.HASH                 = 1
  1152.       START.INDIV                = 0
  1153.       START.OFFICE.HOURS         = 800
  1154.       SURVIVE.NOUSER.ROOM        = FALSE
  1155.       SWITCH.BACK                = FALSE
  1156.       SYSOP.COMMANDS.DEFAULTS$   = "1234567"
  1157.       SYSOP.COMMANDS$            = SYSOP.COMMANDS.DEFAULTS$
  1158.       SYSOP.FUNCTION$(1,1)       = " 1 List comments      "
  1159.       SYSOP.FUNCTION$(2,1)       = " 2 List CALLERS log   "
  1160.       SYSOP.FUNCTION$(3,1)       = " 3 Recover a message  "
  1161.       SYSOP.FUNCTION$(4,1)       = " 4 Erase comments     "
  1162.       SYSOP.FUNCTION$(5,1)       = " 5 User maintenance   "
  1163.       SYSOP.FUNCTION$(6,1)       = " 6 Toggle Page bell   "
  1164.       SYSOP.FUNCTION$(7,1)       = " 7 Exit to DOS        "
  1165.       SYSOP.FUNCTION$(1,2)       = " 1"
  1166.       SYSOP.FUNCTION$(2,2)       = " 2"
  1167.       SYSOP.FUNCTION$(3,2)       = " 3"
  1168.       SYSOP.FUNCTION$(4,2)       = " 4"
  1169.       SYSOP.FUNCTION$(5,2)       = " 5"
  1170.       SYSOP.FUNCTION$(6,2)       = " 6"
  1171.       SYSOP.FUNCTION$(7,2)       = " 7"
  1172.       SYSOP.FIRST.NAME$          = "TOM"
  1173.       SYSOP.LAST.NAME$           = "MACK"
  1174.       SYSOP.MENU.SECURITY.LEVEL  = SYSOP.SECURITY.LEVEL
  1175.       SYSOP.PASSWORD.1$          = "RBBS-PC"
  1176.       SYSOP.PASSWORD.2$          = "CPC17-1A"
  1177.       TIME.TO.DROP.TO.DOS        = 0
  1178.       TRASHCAN.FILE$             = D$ + "TRASHCAN"
  1179.       TURN.PRINTER.OFF           = FALSE
  1180.       TURBO.RBBS                 = TRUE
  1181.       UE                         = 5
  1182.       FMS.DIRECTORY$             = ""
  1183.       UPCAT.HELP$                = "UPCAT"
  1184.       UPLOAD.DIRECTORY$          = "99"
  1185.       UPLOAD.PATH$               = D$
  1186.       UPLOAD.SUBDIR$             = ""
  1187.       UPLOAD.TIME.FACTOR!        = 0
  1188.       UPLOAD.TO.SUBDIR           = FALSE
  1189.       USE.BASIC.WRITES           = FALSE
  1190.       USE.DEVICE.DRIVER$         = ""
  1191.       USE.EXTERNAL.XMODEM        = FALSE
  1192.       USE.EXTERNAL.YMODEM        = FALSE
  1193.       USER.INITIALIZE.COMMAND$   = "AT&C1&D3B1E0V1M0S0=0&T5"
  1194.       USER.FIRMWARE.CLEAR.CMND$  = "AT&F"
  1195.       USER.FIRMWARE.WRITE.CMND$  = "&W"
  1196.       USER.LOCATION$             = "CITY and STATE"
  1197.       UTIL.COMMANDS.DEFAULTS$    = "BCEFGLMPRSTU"
  1198.       UTIL.COMMANDS$             = UTIL.COMMANDS.DEFAULTS$
  1199.       UTILITY.FUNCTION$(1,1)     = "B)aud rate            "
  1200.       UTILITY.FUNCTION$(2,1)     = "C)lock (time)         "
  1201.       UTILITY.FUNCTION$(3,1)     = "E)cho                 "
  1202.       UTILITY.FUNCTION$(4,1)     = "F)ile x-fer protocol  "
  1203.       UTILITY.FUNCTION$(5,1)     = "G)raphics             "
  1204.       UTILITY.FUNCTION$(6,1)     = "L)ines per page       "
  1205.       UTILITY.FUNCTION$(7,1)     = "M)sg margin setting   "
  1206.       UTILITY.FUNCTION$(8,1)     = "P)assword change      "
  1207.       UTILITY.FUNCTION$(9,1)     = "R)eview defaults      "
  1208.       UTILITY.FUNCTION$(10,1)    = "S)tatistics           "
  1209.       UTILITY.FUNCTION$(11,1)    = "T)oggle               "
  1210.       UTILITY.FUNCTION$(12,1)    = "U)ser log scan        "
  1211.       XON.XOFF                   = FALSE
  1212.       FOR I = 1 TO LEN(UTIL.COMMANDS.DEFAULTS$)
  1213.          UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS.DEFAULTS$,I,1)
  1214.       NEXT
  1215.       WAIT.BEFORE.DISCONNECT     = 180
  1216.       WELCOME.FILE$              = D$ + "WELCOME"
  1217.       WELCOME.INTERRUPTABLE      = TRUE
  1218.       WILL.SUBDIRS.B.USED        = FALSE
  1219.       WRITE.BUF.DEF              = 1024
  1220.       FOR I = 1 TO NUM.SYSOP
  1221.          SYSOP.FUNCTION(I) = SF
  1222.       NEXT
  1223.       FOR I = 1 TO NUM.MAIN
  1224.          MAIN.FUNCTION(I) = MM
  1225.       NEXT
  1226.       FOR I = 1 TO NUM.FILES
  1227.          FILES.FUNCTION(I) = FC
  1228.       NEXT
  1229.       FOR I = 1 TO NUM.LIBRARY
  1230.          LIBRARY.FUNCTION(I) = PS
  1231.       NEXT
  1232.       FOR I = 1 TO NUM.UTILITY
  1233.          UTILITY.FUNCTION(I) = UE
  1234.       NEXT
  1235.       FOR I = 1 TO NUM.GLOBAL
  1236.          GLOBAL.FUNCTION(I) = GB
  1237.       NEXT
  1238.       END SUB
  1239. '  $SUBTITLE: 'ASKRO - ask a question at a specific row'
  1240. '  $PAGE
  1241. '
  1242. '  SUBROUTINE NAME    --  ASKRO
  1243. '
  1244. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1245. '                         ANS$           STRING TO PUT THE ANSWER IN
  1246. '                         STRNG$         STRING CONTAINING THE QUESTION
  1247. '                         RO             ROW TO ASK THE QUESTION ON
  1248. '
  1249. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1250. '
  1251. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1252. '                         SPECIFIC ROW
  1253. '
  1254.       SUB ASKRO (STRNG$,RO,ANS$) STATIC
  1255. 61100 LOCATE RO,1
  1256.       PRINT SPACE$(79);
  1257.       LOCATE RO,5
  1258.       PRINT STRNG$;" ";
  1259.       LINE INPUT;ANS$
  1260.       END SUB
  1261. '  $SUBTITLE: 'GETINIT - get an integer'
  1262. '  $PAGE
  1263. '
  1264. '  SUBROUTINE NAME    --  GETINIT
  1265. '
  1266. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1267. '                         ANS            WHERE TO PUT THE ANSWER IN
  1268. '                         STRNG$         STRING CONTAINING THE QUESTION
  1269. '                         RO             ROW TO ASK THE QUESTION ON
  1270. '                         MIN            MINIMUM ACCEPTABLE NUMBER
  1271. '                         MAX            MAXIMUM ACCEPTABLE NUMBER
  1272. '
  1273. '  OUTPUT PARAMETERS  --  ANS            RESPONSE FROM THE KEYBOARD
  1274. '
  1275. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1276. '                         SPECIFIC ROW AND GET AN INTEGER BACK
  1277. '
  1278.       SUB GETINIT (STRNG$,RO,MIN,MAX,ANS,CR) STATIC
  1279. 61110 LOCATE RO,1
  1280.       CR = FALSE
  1281.       ANS = MIN
  1282.       PRINT SPACE$(79);
  1283.       LOCATE RO,5
  1284.       PRINT STRNG$;" ";
  1285.       LINE INPUT;ANS$
  1286.       IF ANS$ = "" THEN _
  1287.          CR = TRUE : _
  1288.          EXIT SUB
  1289.       IF VAL(ANS$) < MIN OR _
  1290.          VAL(ANS$) > MAX THEN _
  1291.          GOTO 61110
  1292.       ANS = VAL(ANS$)
  1293.       END SUB
  1294. '  $SUBTITLE: 'GETNUMYN - get a TRUE-FALSE answer to a YES OR NO question'
  1295. '  $PAGE
  1296. '
  1297. '  SUBROUTINE NAME    --  GETNUMYN
  1298. '
  1299. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1300. '                         STRNG$         STRING CONTAINING THE QUESTION
  1301. '
  1302. '  OUTPUT PARAMETERS  --  ANS            Returned value - -1 IF yes, 0 IF no
  1303. '
  1304. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1305. '                         YES OR NO ANSWER CONVERTED TO TRUE/FALSE
  1306. '
  1307.        SUB GETNUMYN (STRNG$,ANS) STATIC
  1308.        CALL GETYESNO (STRNG$,ANS$)
  1309.        ANS = FNYESNO (ANS$)
  1310.        END SUB
  1311. '  $SUBTITLE: 'GETYESNO - Ask a YES OR NO question'
  1312. '  $PAGE
  1313. '
  1314. '  SUBROUTINE NAME    --  GETYESNO
  1315. '
  1316. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1317. '                         ANS$           STRING TO PUT THE ANSWER IN
  1318. '                         STRNG$         STRING CONTAINING THE QUESTION
  1319. '
  1320. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1321. '
  1322. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1323. '                         YES OR NO ANSWER
  1324. '
  1325.       SUB GETYESNO (STRNG$,ANS$) STATIC
  1326. 61200 CALL ASKRO (STRNG$+" (Y)es or N)o)",24,HJ$)
  1327.       L = LEN(HJ$)
  1328.       IF L < 1 OR L > 3 THEN _
  1329.          GOTO 61207
  1330.       CALL ALLCAPS(HJ$)
  1331.       X = INSTR("NY",LEFT$(HJ$,1))
  1332.       ON X GOTO 61210,61212
  1333. 61207 BEEP
  1334.       GOTO 61200
  1335. 61210 ANS$ = "NO"
  1336.       EXIT SUB
  1337. 61212 ANS$ = "YES"
  1338.       EXIT SUB
  1339.       END SUB
  1340. '  $SUBTITLE: 'ALLCAPS - convert a sting into all capital letters'
  1341. '  $PAGE
  1342. '
  1343. '  SUBROUTINE NAME    --  ALLCAPS
  1344. '
  1345. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1346. '                         STRNG$         STRING CONTAINING THE QUESTION
  1347. '
  1348. '  OUTPUT PARAMETERS  --  STRNG$         CAPITALIZED STRING
  1349. '
  1350. '  SUBROUTINE PURPOSE --  TO CAPITALIZE A STRING
  1351. '
  1352.       SUB ALLCAPS (STRNG$) STATIC
  1353.       FOR Z = 1 TO LEN(STRNG$)
  1354.         MID$(STRNG$,Z,1) = CHR$(ASC(MID$(STRNG$,Z,1)) + _
  1355.                            32 * (ASC(MID$(STRNG$,Z,1)) > 96))
  1356.       NEXT
  1357.       END SUB
  1358. '  $SUBTITLE: 'ASKUPOS - find the unique user field for USERS'
  1359. '  $PAGE
  1360. '
  1361. '  SUBROUTINE NAME    --  ASKUPOS
  1362. '
  1363. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1364. '                         HDR$           HEADER
  1365. '                         BEGIN.COL      BEGINNING COLUMN OF FIELD
  1366. '                         FIELD.LEN      LENGTH OF FIELD IN USER'S RECORD
  1367. '                         PRMPT$         PROMPT TO GIVE FOR FIELD
  1368. '
  1369. '  OUTPUT PARAMETERS  --  ABOVE INPUTS UPDATED WITH USER'S RESPONSES
  1370. '
  1371. '  SUBROUTINE PURPOSE --  TO ASK THE SYSOP WHAT UNIQUE FIELD IN THE USERS
  1372. '                         RECORD IS TO BE ASKED FOR AT LOGON
  1373. '
  1374.       SUB ASKUPOS (HDR$,BEGIN.COL,FIELD.LEN,PRMPT$) STATIC
  1375.       CLS
  1376.       LOCATE 3,20
  1377.       PRINT HDR$;
  1378. 61300 LOCATE 6,5
  1379.       PRINT "1.  BEGINNING COLUMN in USERS file";TAB(44);STR$(BEGIN.COL);"   ";
  1380.       LOCATE 8,5
  1381.       PRINT "2.  Number of CHARACTERS to use";TAB(44);STR$(FIELD.LEN);"   ";
  1382.       LOCATE 10,5
  1383.       PRINT "3.  PROMPT to display to callers";TAB(45);PRMPT$;SPACE$(34-LEN(PRMPT$));
  1384. 61310 CALL ASKRO ("Select option to change (1-3, ENTER to end)",24,X$)
  1385.       IF X$ = "" THEN _
  1386.          EXIT SUB
  1387.       X = VAL(X$)
  1388.       IF X < 1 OR X > 3 THEN _
  1389.          GOTO 61310
  1390.       ON X GOTO 61320,61330,61340
  1391. 61320 CALL ASKRO ("New BEGINNING COLUMN",24,HJ$)
  1392.       IF HJ$ = "" THEN _
  1393.          GOTO 61320
  1394.       X = VAL(HJ$)
  1395.       IF X < 0 OR X > 128 THEN _
  1396.          GOTO 61320
  1397.       BEGIN.COL = X
  1398.       GOTO 61300
  1399. 61330 CALL ASKRO ("New # CHARACTERS to use",24,HJ$)
  1400.       IF HJ$ = "" THEN _
  1401.          GOTO 61330
  1402.       X = VAL(HJ$)
  1403.       IF X < 0 OR X > 31 THEN _
  1404.          GOTO 61330
  1405.       FIELD.LEN = X
  1406.       GOTO 61300
  1407. 61340 CALL ASKRO ("New PROMPT",24,HJ$)
  1408.       IF LEN(HJ$) > 34 THEN _
  1409.          GOTO 61340
  1410.       PRMPT$ = HJ$
  1411.       GOTO 61300
  1412.       END SUB
  1413. '  $SUBTITLE: 'ANYNUMBER - input any numeric value'
  1414. '  $PAGE
  1415. '
  1416. '  SUBROUTINE NAME    --  ANYNUMBER
  1417. '
  1418. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1419. '                         PRMPT$           PROMPT
  1420. '
  1421. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1422. '
  1423. '  SUBROUTINE PURPOSE --  TO GET A NUMERIC VALUE
  1424. '
  1425.       SUB ANYNUMBER (PRMPT$,RETURNED.VALUE!) STATIC
  1426. 61400 CALL ASKRO (PRMPT$,24,HJ$)
  1427.       RETURNED.VALUE! = VAL(HJ$)
  1428.       END SUB
  1429. '  $SUBTITLE: 'ANYINTEGER - input any integer value'
  1430. '  $PAGE
  1431. '
  1432. '  SUBROUTINE NAME    --  ANYINTEGER
  1433. '
  1434. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1435. '                         PRMPT$           PROMPT TO DISPLAY
  1436. '
  1437. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1438. '
  1439. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE
  1440. '
  1441.       SUB ANYINTEGER (PRMPT$,RETURNED.VALUE) STATIC
  1442. 61450 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1443.       IF RETURNED.VALUE! >  32767.0 OR _
  1444.          RETURNED.VALUE! < -32767.0 THEN_
  1445.          BEEP : _
  1446.          GOTO 61450
  1447.       RETURNED.VALUE = RETURNED.VALUE!
  1448.       END SUB
  1449. '  $SUBTITLE: 'MMINTEGER - input any integer value with range check'
  1450. '  $PAGE
  1451. '
  1452. '  SUBROUTINE NAME    --  MMINTEGER
  1453. '
  1454. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1455. '                         PRMPT$           PROMPT
  1456. '                         MIN              MINIMUM VALUE (INCLUSIVE)
  1457. '                         MAX              MAXIMUM VALUE (INCLUSIVE)
  1458. '
  1459. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1460. '
  1461. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE WITHIN A RANGE
  1462. '
  1463.       SUB MMINTEGER (PRMPT$,MIN,MAX,RETURNED.VALUE) STATIC
  1464. 61500 CALL ANYINTEGER (PRMPT$,RETURNED.VALUE)
  1465.       IF RETURNED.VALUE < MIN OR RETURNED.VALUE > MAX THEN _
  1466.          BEEP : _
  1467.          GOTO 61500
  1468.       END SUB
  1469. '  $SUBTITLE: 'FINDFILE - Determine whether a file exists'
  1470. '  $PAGE
  1471. '
  1472. '  SUBROUTINE NAME    --  FINDFILE
  1473. '
  1474. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1475. '                         FILNAME$         FILE TO LOOK FOR
  1476. '                         FEXISTS          WHETHER FILE EXISTS
  1477. '
  1478. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1479. '
  1480. '  SUBROUTINE PURPOSE --  DETERMINE WHETHER PASSED FILE NAME EXISTS
  1481. '                         RETURN TRUE OR FALSE IN "FEXISTS"
  1482. '
  1483.       SUB FINDFILE (FILNAME$,FEXISTS) STATIC
  1484. 61600 CALL RBBSFIND (FILNAME$,Z,Y,M,D)
  1485.       FEXISTS = (Z = 0)
  1486.       END SUB
  1487. '  $SUBTITLE: 'CHKFMSDIR - Validate structure of FMS directory'
  1488. '  $PAGE
  1489. '
  1490. '  SUBROUTINE NAME    --  CHKFMSDIR
  1491. '
  1492. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1493. '                         FMSDIR$         NAME OF FMS DIRECTORY
  1494. '                         LINELEN         PROPER LENGTH OF LINES
  1495. '                                         (EXCLUDING CR/LF AT END)
  1496. '                         FMS.DIRCAT$     CATEGORY FILE FOR FMS
  1497. '
  1498. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1499. '
  1500. '  SUBROUTINE PURPOSE --  VERIFIES THAT FMS IS IN VALID FORMAT
  1501. '                         AND DIAGNOSES PROBLEMS
  1502. '
  1503. 61700 SUB CHKFMSDIR (FMSDIR$,LINELEN,FMS.DIRCAT$) STATIC
  1504.       DIM CAT.CODE$(99)
  1505.       CLS
  1506.       LOCATE 5,20
  1507.       PRINT "Checking FMS file ";FMSDIR$;
  1508.       NLINES = 0
  1509.       LOCATE 7,27
  1510.       PRINT "Line #";
  1511.       LOCATE 9,20
  1512.       COLOR 0,7
  1513.       PRINT " Last Line with an ERROR ";
  1514.       LOCATE 12,28
  1515.       PRINT " Last ERROR ";
  1516.       COLOR 7,0
  1517.       NCATS = 0
  1518.       CALL FINDFILE (FMS.DIRCAT$,FEXISTS)
  1519.       IF FEXISTS THEN _
  1520.          NCATS = 1:_
  1521.          CAT.CODE$(1) = "***":_
  1522.          OPEN FMS.DIRCAT$ FOR INPUT AS #2 : _
  1523.          WHILE NOT EOF(2) AND NCATS < UBOUND(CAT.CODE$) :_
  1524.             NCATS = NCATS + 1:_
  1525.             INPUT #2,X$,Y$,X$:_
  1526.             CAT.CODE$(NCATS) = Y$:_
  1527.          WEND:_
  1528.          CLOSE 2
  1529.       GO.ON = -1
  1530.       CALL FINDFILE (FMSDIR$,FEXISTS)
  1531.       IF NOT FEXISTS THEN _
  1532.          LOCATE 6,25 : _
  1533.          PRINT "File not found"; : _
  1534.          GOTO 61750
  1535.       OPEN FMSDIR$ FOR INPUT AS #2
  1536.       WHILE NOT EOF(2) AND GO.ON
  1537.          NLINES = NLINES + 1
  1538.          LINE INPUT #2, A$
  1539.          L = LEN(A$)
  1540.          LOCATE 7,36
  1541.          PRINT NLINES;
  1542.          IF L > LINELEN THEN _
  1543.             CALL HANDERR (A$,NLINES,"Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN),GO.ON):_
  1544.             IF NOT GO.ON THEN _
  1545.                GOTO 61740
  1546.          IF L < LINELEN THEN _
  1547.             X$ = "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN) : _
  1548.             CALL HANDERR (A$,NLINES,X$,GO.ON):_
  1549.             IF NOT GO.ON THEN _
  1550.                GOTO 61740
  1551.          IF L > 0 THEN _
  1552.             IF INSTR ("\* ",LEFT$(A$,1)) THEN _
  1553.                GOTO 61740
  1554.          IF L > 30 THEN _
  1555.             X$ = MID$(A$,24,2) + _
  1556.                  MID$(A$,27,2) + _
  1557.                  MID$(A$,30,2) : _
  1558.             I = 1 : _
  1559.             WHILE I < 7 AND INSTR("0123456789",MID$(X$,I,1)) > 0 : _
  1560.                I = I + 1: _
  1561.             WEND: _
  1562.             IF I < 7 THEN _
  1563.                CALL HANDERR (A$,NLINES,"INVALID CHARACTER <" + MID$(X$,I,1) + "> in date field",GO.ON) : _
  1564.                IF NOT GO.ON THEN _
  1565.                   GOTO 61740
  1566.          I = 1
  1567.          Y$ = MID$(A$,L - 2)
  1568.          CALL REMOVE (Y$," ")
  1569.          WHILE I <= NCATS AND Y$ <> CAT.CODE$(I)
  1570.             I = I + 1
  1571.          WEND
  1572.          IF I > NCATS THEN _
  1573.             CALL HANDERR (A$,NLINES,"Category code <" + Y$ + "> NOT IN " + FMS.DIRCAT$,GO.ON)
  1574. 61740 WEND
  1575. 61750 CLOSE 2
  1576.       IF GO.ON THEN _
  1577.          LOCATE 15,15:_
  1578.          BEEP:_
  1579.          CALL ASKRO ("           Done checking.  Press [ENTER] to continue",20,ANS$)
  1580.       END SUB
  1581. '  $SUBTITLE: 'CHKPERSDIR - Validate personal directories'
  1582. '  $PAGE
  1583. '
  1584. '  SUBROUTINE NAME    --  CHKPERSDIR
  1585. '
  1586. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1587. '                         PDIR$           NAME OF PERSONAL DIRECTORY
  1588. '                         NAMELEN         PROPER LENGTH OF NAME FIELD
  1589. '
  1590. '  OUTPUT PARAMETERS  --  NONE
  1591. '
  1592. '  SUBROUTINE PURPOSE --  CHECKS PERSONAL DIRECTORY FOR PROPER FORMAT
  1593. '
  1594. 61755 SUB CHKPERSDIR (PDIR$, DESC.LEN, NAMELEN) STATIC
  1595.       CLS
  1596.       LOCATE 5, 21
  1597.       PRINT "Checking Personal Directory "; PDIR$;
  1598.       NLINES = 0
  1599.       LOCATE 7, 27
  1600.       PRINT "Line #";
  1601.       LOCATE 9, 20
  1602.       COLOR 0, 7
  1603.       PRINT " Last Line with an ERROR ";
  1604.       LOCATE 12, 28
  1605.       PRINT " Last ERROR ";
  1606.       COLOR 7, 0
  1607.       GO.ON = -1
  1608.       CALL FINDFILE(PDIR$, FEXISTS)
  1609.       IF NOT FEXISTS THEN _
  1610.          LOCATE 6, 25: _
  1611.          PRINT "File not found"; : _
  1612.          GOTO 61775
  1613.       LINELEN = 34 + DESC.LEN + NAMELEN
  1614.       OPEN PDIR$ FOR INPUT AS #2
  1615.       WHILE NOT EOF(2) AND GO.ON
  1616.          NLINES = NLINES + 1
  1617.          LINE INPUT #2, A$
  1618.          L = LEN(A$)
  1619.          LOCATE 7, 36
  1620.          PRINT NLINES;
  1621.          IF L > LINELEN THEN _
  1622.             CALL HANDERR(A$, NLINES, "Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1623.             IF NOT GO.ON THEN _
  1624.                GOTO 61770
  1625.          IF L < LINELEN THEN _
  1626.             CALL HANDERR(A$, NLINES, "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1627.                IF NOT GO.ON THEN _
  1628.                   GOTO 61770
  1629.          IF L > 30 THEN _
  1630.             X$ = MID$(A$, 24, 2) + MID$(A$, 27, 2) + MID$(A$, 30, 2) : _
  1631.             I = 1 : _
  1632.             WHILE I < 7 AND INSTR("0123456789", MID$(X$, I, 1)) > 0 : _
  1633.                I = I + 1 : _
  1634.             WEND : _
  1635.             IF I < 7 THEN _
  1636.                CALL HANDERR(A$, NLINES, "INVALID CHARACTER <" + MID$(X$, I, 1) + "> in date field", GO.ON) : _
  1637.                IF NOT GO.ON THEN _
  1638.                   GOTO 61770
  1639.            IF L = LINELEN THEN _
  1640.               X$ = RIGHT$(A$, 1) : _
  1641.               IF INSTR("*!", X$) = 0 THEN _
  1642.                  CALL HANDERR(A$, NLINES, "Last char on line should be * or ! but found <" + X$ + ">", GO.ON) : _
  1643.                  IF NOT GO.ON THEN  _
  1644.                     GOTO 61770
  1645.            IF L = LINELEN THEN _
  1646.               X$ = MID$(A$, L - NAMELEN, LINELEN) : _
  1647.               IF LEFT$(X$, 1) = " " THEN _
  1648.                  IF INSTR("0123456789-", MID$(X$, 2, 1)) = 0 THEN _
  1649.                     CALL HANDERR(A$, NLINES, "Name field at col" + STR$(L - NAMELEN) + " has <" + LEFT$(X$, 1) + ">, needs non-blank or blank+number", GO.ON) : _
  1650.                     IF NOT GO.ON THEN _
  1651.                        GOTO 61770
  1652. 61770 WEND
  1653. 61775 CLOSE 2
  1654.       IF GO.ON THEN _
  1655.          LOCATE 15, 15 : _
  1656.          BEEP : _
  1657.          CALL ASKRO("           Done checking.  Press [ENTER] to continue", 20, ANS$)
  1658.       END SUB
  1659. '  $SUBTITLE: 'HANDERR - subroutine to handle FMS errors'
  1660. '  $PAGE
  1661. '
  1662. '  SUBROUTINE NAME    -- HANDERR
  1663. '
  1664. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1665. '                        ERRLINE$                LINE THAT HAS THE ERROR
  1666. '                        ERRL                    LINE NUMBER WITH ERROR
  1667. '                        ERRMES$                 ERROR MESSAGE TO ISSUE
  1668. '
  1669. '  OUTPUT PARAMETERS  -- GO.ON                   INIDCATE TO PROCEDURE OR NOT
  1670. '
  1671. '  SUBROUTINE PURPOSE -- TO HANDLE ERROR CHECKING OF THE FMS DIRECTORY
  1672. '
  1673.       SUB HANDERR (ERRLINE$,ERRL,ERRMES$,GO.ON) STATIC
  1674.       LOCATE 10,1
  1675.       PRINT SPACE$(80);
  1676.       LOCATE 10,1
  1677.       PRINT ERRLINE$;
  1678.       LOCATE 9,45
  1679.       PRINT STR$(ERRL);
  1680.       LOCATE 13,1
  1681.       PRINT SPACE$(79);
  1682.       L = LEN(ERRMES$)
  1683.       IF L > 68 THEN _
  1684.          STRT = 1 _
  1685.       ELSE STRT = (70 - L) / 2
  1686.       LOCATE 13,STRT
  1687.       PRINT ERRMES$;
  1688.       CALL ASKRO ("               CONTINUE checking (Y/N,[ENTER]=Y) ",20,ANS$)
  1689.       IF ANS$ = "" THEN _
  1690.          ANS$ = "Y"
  1691.       CALL ALLCAPS (ANS$)
  1692.       GO.ON = FNYESNO (ANS$)
  1693.       END SUB
  1694. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  1695. ' $PAGE
  1696. '
  1697. '  SUBROUTINE NAME    -- REMOVE
  1698. '
  1699. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1700. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  1701. '                                                TO BE DELETED FROM "L$"
  1702. '                        L$                      STRING TO BE ALTERED
  1703. '
  1704. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  1705. '                                                "BADSTRING#" DELETED FROM IT
  1706. '
  1707. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  1708. '                        "BADSTRING$" FROM "L$"
  1709. '
  1710.       SUB REMOVE (L$,BADSTRNG$) STATIC
  1711. 61800 J = 0
  1712.       FOR I = 1 TO LEN(L$)
  1713.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  1714.             J = J + 1:_
  1715.             MID$(L$,J,1) = MID$(L$,I,1)
  1716.       NEXT I
  1717.       L$ = LEFT$(L$,J)
  1718.       END SUB
  1719. ' $SUBTITLE: 'GETASCII - subroutine to prompt for any ASCII values'
  1720. ' $PAGE
  1721. '
  1722. '  SUBROUTINE NAME    -- GETASCII
  1723. '
  1724. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1725. '                        TITLE$                  HEADER EXPANATION FOR PARAM
  1726. '
  1727. '  OUTPUT PARAMETERS  -- STRNG$                  RESULTANT CONFIG PARAMETER
  1728. '
  1729. '  SUBROUTINE PURPOSE -- ALLOWS ANY ASCII CHARACTER TO BE STORED IN A PARAMETER
  1730. '                        BY ENCLOSING IT IN SQUARE BRACKETS.  CHARACTERS NOT IN
  1731. '                        SQUARE BRACKETS ARE INTERPRETED EXACTLY AS ENTERED.
  1732. '                        CHARACTER'S ASCII VALUE EQUAL THE NUMERIC VALUE IN THE
  1733. '                        SQUARE BRACKETS.
  1734. '
  1735.       SUB GETASCII (TITLE$,STRNG$) STATIC
  1736. 61810 CLS
  1737.       LOCATE 8,30
  1738.       PRINT TITLE$;
  1739.       LOCATE 13,5
  1740.       PRINT "Current value is"
  1741.       PRINT STRNG$
  1742.       PRINT
  1743.       PRINT "Please enter the new values by entering the character"
  1744.       PRINT "or enclosing its ASCII value in square brackets:"
  1745.       PRINT "(Press ENTER to make empty)
  1746.       LINE INPUT "";HJ$
  1747.       STRNG$ = HJ$
  1748.       END SUB
  1749. ' $SUBTITLE: 'BRKFNAME - subroutine to decompose a file name'
  1750. ' $PAGE
  1751. '
  1752. '  SUBROUTINE NAME    -- BRKFNAME
  1753. '
  1754. '  INPUT PARAMETERS   -- PARAMETER                     MEANING
  1755. '                        FILENAME$       NAME OF THE FILE TO BE DECOMPOSED
  1756. '                        FOR.JOINING     INDICATOR IF OUTPUT IS TO BE COMPBINED
  1757. '
  1758. '  OUTPUT PARAMETERS  -- DRVPATH$        DRIVE AND PATH
  1759. '                        PREFIX$         8-CHARACTER FILE NAME PREFIX
  1760. '                        EXTENSION$      3-CHARACTER EXTENSION
  1761. '
  1762. '  SUBROUTINE PURPOSE -- BREAKS DOWN A FILE NAME INTO A DRIVE AND PATH,
  1763. '                        FILE PREFIX (8 CHARACTERS), AND FILE EXTENSION
  1764. '                        (3 CHARACTERS).  IF "FOR.JOINING" IS TRUE, THE
  1765. '                        DRIVE AND PATH HAVE A ":" AND A "\" IN IT AND
  1766. '                        THE EXTENSION BEGINS WITH A ".".
  1767. '
  1768.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1769. 61830 CALL ALLCAPS (FILENAME$)
  1770.       DRVPATH$ = ""
  1771.       PREFIX$ = ""
  1772.       EXTENSION$ = ""
  1773.       CALL TRIMTRAIL (FILENAME$,"\")
  1774.       IF LEN(FILENAME$) < 1 THEN _
  1775.          EXIT SUB
  1776.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1777.       IF X < 1 THEN _
  1778.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1779.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1780.             S = 3 _
  1781.          ELSE S = 1 _
  1782.       ELSE DRVPATH$ = LEFT$(FILENAME$,X - 1) : _
  1783.            S = X + 1
  1784.       X = INSTR(FILENAME$+".",".")
  1785.       EXTENSION$ = MID$(FILENAME$,X + 1,3)
  1786.       PREFIX$ = MID$(FILENAME$,S,X - S)
  1787.       IF NOT FOR.JOINING THEN _
  1788.          EXIT SUB
  1789.       IF LEN(DRVPATH$) = 1 THEN _
  1790.          DRVPATH$ = DRVPATH$ + ":"
  1791.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1792.          DRVPATH$ = DRVPATH$ + "\"
  1793.       IF LEN(EXTENSION$) > 0 THEN _
  1794.          EXTENSION$ = "." + EXTENSION$
  1795.       END SUB
  1796. '
  1797. '  $SUBTITLE: 'TRIMTRAIL - subroutine to trim off trailing characters'
  1798. '  $PAGE
  1799. '
  1800. '  SUBROUTINE NAME    --  TRIMTRAIL
  1801. '
  1802. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  1803. '                         TRIM.PARM$  TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  1804. '                                     BEFORE DISPLAYING
  1805. '                         TRIM.THIS$  WHAT CHARACTER TO TRIM OFF END
  1806. '
  1807. '  OUTPUT PARAMETERS  --  NONE
  1808. '
  1809. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  1810. '
  1811. 61840 SUB TRIMTRAIL (TRIM.PARM$,TRIM.THIS$) STATIC
  1812.       WHILE RIGHT$(TRIM.PARM$,1) = TRIM.THIS$
  1813.          TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$) - 1)
  1814.       WEND
  1815.       END SUB
  1816. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  1817. ' $PAGE
  1818. '
  1819. '  SUBROUTINE NAME    -- FINDLAST
  1820. '
  1821. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1822. '                        LOOK.IN$           STRING TO LOOK INTO
  1823. '                        LOOK.FOR$          STRING TO SEARCH FOR
  1824. '
  1825. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  1826. '                                            LOOK.FOR$ FOUND
  1827. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  1828. '
  1829. '  SUBROUTINE PURPOSE -- FINDS THE LAST OCCURANCE OF "LOOK.FOR$" IN "LOOK.IN$"
  1830. '                        AND RETURNS COUNT OF NUMBER OF OCCURENCES.  IF NONE
  1831. '                        ARE FOUND, BOTH RETURNED PARAMETERS ARE ZERO.
  1832. '
  1833.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  1834. 61850 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  1835.       NUM.FINDS = -(WHERE.FOUND > 0)
  1836.       NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1837.       WHILE NEXT.FOUND > 0
  1838.          NUM.FINDS = NUM.FINDS + 1
  1839.          WHERE.FOUND = NEXT.FOUND
  1840.          NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1841.       WEND
  1842.       END SUB
  1843. ' $SUBTITLE: 'SECURE - subroutine to assign security to commands'
  1844. ' $PAGE
  1845. '
  1846. '  SUBROUTINE NAME    -- SECURE
  1847. '
  1848. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1849. '                        SECTION$           NAME OF THE SECTION
  1850. '                        DEFAULTS$          DEFAULT COMMANDS FOR THE SECTION
  1851. '                        NUMBER.OF.COMMANDS NUMBER OF COMMANDS IN THE SECTION
  1852. '                        COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1853. '                                              CHARACTER COMMANDS
  1854. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1855. '                                           THE COMMAND
  1856. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1857. '                                             THE SECTION
  1858. '
  1859. '  OUTPUT PARAMETERS  -- COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1860. '                                              CHARACTER COMMANDS
  1861. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1862. '                                           THE COMMAND
  1863. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1864. '                                             THE SECTION
  1865. '
  1866. '  SUBROUTINE PURPOSE -- ALLOWS USERS TO MODIFY COMMANDS AND SECURITY FOR
  1867. '                        EACH COMMAND.
  1868. '
  1869.       SUB SECURE (SECTION$,DEFAULTS$,NUMBER.OF.COMMANDS,COMMANDS$(2),COMMANDS(1),SECTION.COMMANDS$) STATIC
  1870. 61860 IF IPAGE = 2 OR _
  1871.          VAL(OPTION$) = 310 THEN _
  1872.          XX$ = "ALL " + _
  1873.                SECTION$ + _
  1874.                " commands use default letters?" _
  1875.       ELSE XX$ = "ALL " + _
  1876.                SECTION$ + _
  1877.                " commands = SAME security level?"
  1878.       LOCATE 24,1
  1879.       PRINT SPACE$(79);
  1880.       LOCATE 24,1
  1881.       CALL GETNUMYN (XX$,AB)
  1882.       IF NOT AB THEN _
  1883.          GOTO 61880
  1884. 61870 IF IPAGE = 2 OR _
  1885.          VAL(OPTION$) = 310 THEN _
  1886.          SECTION.COMMANDS$ = DEFAULTS$ : _
  1887.          FOR I = 1 TO NUMBER.OF.COMMANDS : _
  1888.             COMMANDS$(I,2) = MID$(SECTION.COMMANDS$,I,1) : _
  1889.          NEXT : _
  1890.          EXIT SUB
  1891.       CALL MMINTEGER("Security level for all " + _
  1892.                       SECTION$ + _
  1893.                      " commands is?",-32767,32767,B1)
  1894.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1895.          COMMANDS(I) = B1
  1896.       NEXT
  1897.       GB = B1
  1898.       EXIT SUB
  1899. 61880 GOSUB 61900
  1900.       IROW = 4
  1901.       ICOL = 10
  1902.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1903.          LOCATE IROW + I,ICOL
  1904.          IF IPAGE = 2 OR _
  1905.             VAL(OPTION$) = 310 THEN _
  1906.             PRINT COMMANDS$(I,1);" ";COMMANDS$(I,2) _
  1907.          ELSE PRINT COMMANDS$(I,1);STR$(COMMANDS(I))
  1908.       NEXT
  1909. 61890 CALL ASKRO("Enter first character of command ([ENTER] quits)",24,X$)
  1910.       IF X$ = "" THEN _
  1911.          EXIT SUB
  1912.       IF LEN(X$) <> 1 THEN _
  1913.          GOTO 61890
  1914.       CALL ALLCAPS(X$)
  1915.       FF = INSTR(DEFAULTS$,X$)
  1916.       IF FF = 0 THEN _
  1917.          GOTO 61890
  1918.       IF IPAGE = 2 OR _
  1919.          VAL(OPTION$) = 310 THEN _
  1920.          GOTO 61892
  1921.       CALL MMINTEGER("Security level for all " + _
  1922.                       SECTION$ + _
  1923.                      " '" + _
  1924.                      X$ + _
  1925.                      "' commands is?",-32767,32767,B1)
  1926.       GOTO 61893
  1927. 61892 CALL ASKRO("New command for " + _
  1928.                   MID$(COMMANDS$(FF,1),1,INSTR(COMMANDS$(FF,1),"  ")) + _
  1929.                  "is?",24,HK$)
  1930.       X$ = MID$(HK$,1,1)
  1931.       CALL ALLCAPS (X$)
  1932.       IF LEN(HK$) > 1 THEN _
  1933.          HK$ = X$ + MID$(HK$,2)
  1934.       IF LEN (HK$) = 1 THEN _
  1935.          HK$ = X$
  1936.       COMMANDS$(FF,2) = HK$
  1937.       MID$(SECTION.COMMANDS$,FF,1) = HK$
  1938.       GOTO 61880
  1939. 61893 COMMANDS(FF) = B1
  1940.       GOTO 61880
  1941. '
  1942. ' * COMMON ROUTINE TO DISPLAY SUBSYSTEM COMMANDS AND THEIR SECURITY LEVELS
  1943. '
  1944. 61900 CLS
  1945.       I! = FRE(C$)
  1946.       COLOR 0,7,0
  1947.       LOCATE 1,23
  1948.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " Default Configuration";
  1949.       COLOR FG,BG,BORDER
  1950.       LOCATE  2,5
  1951.       PRINT "The RBBS-PC " + _
  1952.              SECTION$ + _
  1953.             " Commands are as follows:"
  1954.       LOCATE   3,10
  1955.       XX$ = "Command             Security"
  1956.       IF IPAGE = 2 OR _
  1957.          VAL(OPTION$) = 310 THEN _
  1958.          XX$ = "Description         Command"
  1959.       PRINT XX$
  1960.       RETURN
  1961.       END SUB
  1962. '  $SUBTITLE: 'GETCOLOR - get colors using natural language'
  1963. '  $PAGE
  1964. '
  1965. '  SUBROUTINE NAME    -- GETCOLOR
  1966. '
  1967. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1968. '                        STRNG$             TITLE OF WHAT COLOR IS FOR
  1969. '                        NUM.COLOR          CURRENT COLOR SETTING
  1970. '
  1971. '  OUTPUT PARAMETERS  -- NUM.COLOR          NEW COLOR SETTING
  1972. '
  1973. '  SUBROUTINE PURPOSE -- SET THE COLOR USING NATURAL LANGUAGE PHRASES
  1974. '
  1975.       SUB GETCOLOR (STRNG$,NUM.COLOR) STATIC
  1976.       CLS
  1977. 61950 IF NUM.COLOR > 7 THEN _
  1978.          X = NUM.COLOR - 8 _
  1979.       ELSE X = NUM.COLOR
  1980.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",X*6+1,6)
  1981.       LOCATE 9,15
  1982.       PRINT STRNG$;" now ";X$;"     ";
  1983. 61955 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",20,ANS$)
  1984.       IF ANS$ = "" THEN _
  1985.          EXIT SUB
  1986.       CALL ALLCAPS (ANS$)
  1987.       Y = INSTR("NBGCRPYW",ANS$) - 1
  1988.       IF Y < 0 THEN _
  1989.          GOTO 61955
  1990.       NUM.COLOR = Y
  1991.       GOTO 61950
  1992.       END SUB
  1993. ' $SUBTITLE: 'GETANSI - SUBROUTINE TO GET CALLERS COLOR VALUES'
  1994. ' $PAGE
  1995. '
  1996. '  SUBROUTINE NAME    -- GETANSI
  1997. '
  1998. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1999. '                        SELECTION$       NAME OF SELECTION TO HAVE COLOR
  2000. '                        PRMPT$           WHAT TO PROMPT ON THE SCREEN
  2001. '
  2002. '  OUTPUT PARAMETERS  -- FG.1.DEF$        FIRST COLOR SELECTION
  2003. '                        FG.2.DEF$        SECOND COLOR SELECTION
  2004. '                        FG.3.DEF$        THIRD COLOR SELECTION
  2005. '                        FG.4.DEF$        FOURTH COLOR SELECTION
  2006. '
  2007. '  SUBROUTINE PURPOSE -- ASK THE SYSOP TO SELECT THE FOUR COLORS TO BE
  2008. '                        USED FOR CALLERS THAT SELECT COLOR DISPLAYS.
  2009. '
  2010.       SUB GETANSI (SELECTION$,PRMPT$) STATIC
  2011.       CLS
  2012. 62000 LOCATE 8,10
  2013.       PRINT PRMPT$;" Foreground for caller now ";SELECTION$;"       "
  2014.       LOCATE 10,1
  2015.       PRINT "Current foreground selections: ";
  2016.       CALL COLORCODE (FG.1.DEF$,X$,X)
  2017.       COLOR X,CALLER.BKGRD
  2018.       PRINT "First ";
  2019.       CALL COLORCODE (FG.2.DEF$,X$,X)
  2020.       COLOR X
  2021.       PRINT "Second ";
  2022.       CALL COLORCODE (FG.3.DEF$,X$,X)
  2023.       COLOR X
  2024.       PRINT "Third ";
  2025.       CALL COLORCODE (FG.4.DEF$,X$,X)
  2026.       COLOR X
  2027.       PRINT "Fourth"
  2028.       COLOR FG,BG
  2029. 62040 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",14,ANS$)
  2030.       IF ANS$ = "" THEN _
  2031.          EXIT SUB
  2032.       CALL ALLCAPS (ANS$)
  2033.       X = INSTR("NRGYBPCW",ANS$)
  2034.       IF X < 2 THEN _
  2035.          SELECTION$ = NONE.PICKED$ : _
  2036.          GOTO 62000
  2037.       X$ = MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-11,6)
  2038.       CALL ASKRO ("Make "+X$+" [B]right, or N)ormal",17,ANS$)
  2039.       CALL ALLCAPS (ANS$)
  2040.       IF ANS$ <> "N" THEN _
  2041.          SELECTION$ = "Bright " + X$ _
  2042.       ELSE SELECTION$ = "Normal " + X$
  2043.       GOTO 62000
  2044.       END SUB
  2045. ' $SUBTITLE: 'COLORCODE - SUBROUTINE TO GET COLOR CODES'
  2046. ' $PAGE
  2047. '
  2048. '  SUBROUTINE NAME    -- COLORCODE
  2049. '
  2050. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2051. '                        NAT.LANG.COLOR$  NATURAL LANGUAGE LETTER OF COLOR
  2052. '                                           N = NONE
  2053. '                                           B = BLUE
  2054. '                                           G = GREEN
  2055. '                                           C = CYAN
  2056. '                                           R = RED
  2057. '                                           P = PURPLE
  2058. '                                           Y = YELLOW
  2059. '                                           W = WHITE
  2060. '
  2061. '  OUTPUT PARAMETERS  -- ANSI.COLOR$      CORRECT CHARACTER SEQUENCE OF COLOR
  2062. '                        BASIC.FG         NUMBER FOR BASIC FORGROUND
  2063. '
  2064. '  SUBROUTINE PURPOSE -- TO CONVERT THE NATURAL LANGUAGE COLOR SELECTION INTO
  2065. '                        COLOR CODES THAT ARE MEANINGFUL.
  2066. '
  2067.       SUB COLORCODE (NAT.LANG.COLOR$,ANSI.COLOR$,BASIC.FG) STATIC
  2068.       BASIC.FG = 7
  2069.       IF NAT.LANG.COLOR$ = NONE.PICKED$ THEN _
  2070.          ANSI.COLOR$ = "" : _
  2071.          EXIT SUB
  2072.       X = INSTR(" BN",LEFT$(NAT.LANG.COLOR$,1))
  2073.       IF X < 2 THEN _
  2074.          EXIT SUB
  2075.       X$ = MID$("10",X-1,1)
  2076.       X = INSTR(NAT.LANG.COLOR$," ")
  2077.       IF X < 1 OR X >= LEN(NAT.LANG.COLOR$) THEN _
  2078.          EXIT SUB
  2079.       Z$ = MID$(NAT.LANG.COLOR$,X+1,1)
  2080.       X = INSTR("RGYBPCW",Z$)
  2081.       IF X < 1 THEN _
  2082.          EXIT SUB
  2083.       BASIC.FG = INSTR("BGCRPYW",Z$) - 8 * (X$="1")
  2084.       Y$ = MID$(STR$(30+X),2)
  2085.       Z = INSTR("NRGYBPCW",MID$("NBGCRPYW",CALLER.BKGRD+1,1))
  2086.       Z$ = MID$(STR$(39+Z),2)
  2087.       ANSI.COLOR$ = CHR$(27) + "[" + X$ + ";" + Z$ + ";" + Y$ + "m"
  2088.       END SUB
  2089. ' $SUBTITLE: 'ANSIDECODE - SUBROUTINE TO DECODE ANSI VALUES'
  2090. ' $PAGE
  2091. '
  2092. '  SUBROUTINE NAME    -- ANSIDECODE
  2093. '
  2094. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2095. '                        ANSI.EXPRESSION$ EXPRESSION WITH ANSI COLOR CODES IN
  2096. '
  2097. '  OUTPUT PARAMETERS  -- ANSI.EXPRESSION$ ENGLISH LANGUAGE DESCRIPTION OF COLOR
  2098. '
  2099. '  SUBROUTINE PURPOSE -- DECODES THE ANSI EXPRESSION INTO A MEANINGFUL
  2100. '                        ENGLISH TEXT DESCRIPTION.
  2101. '
  2102.       SUB ANSIDECODE (ANSI.EXPRESSION$) STATIC
  2103.       IF LEN (ANSI.EXPRESSION$) < 3 THEN _
  2104.          EXIT SUB
  2105.       IF ASC(ANSI.EXPRESSION$) <> 27 THEN _
  2106.          EXIT SUB
  2107.       X = INSTR(ANSI.EXPRESSION$,";")
  2108.       IF X < 1 THEN _
  2109.          EXIT SUB
  2110.       IF MID$(ANSI.EXPRESSION$,X-1,1) = "1" THEN _
  2111.          X$ = "Bright " _
  2112.       ELSE X$ = "Normal "
  2113.       X = INSTR(X,ANSI.EXPRESSION$,"m")
  2114.       IF X < 1 THEN _
  2115.          EXIT SUB
  2116.       X = VAL(MID$(ANSI.EXPRESSION$,X-2,2)) - 30
  2117.       IF X < 1 OR X > 7 THEN _
  2118.          EXIT SUB
  2119.       ANSI.EXPRESSION$ = X$ + MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-5,6)
  2120.       END SUB
  2121.